Я пробую за половину вечности теперь переопределяющую функцию QWidgets keyPressEvent в QT, но это просто не будет работать. Я должен сказать, что я плохо знаком с CPP, но я знаю ObjC и стандарт C.
Моя проблема похожа на это:
class QSGameBoard : public QWidget {
Q_OBJECT
public:
QSGameBoard(QWidget *p, int w, int h, QGraphicsScene *s);
signals:
void keyCaught(QKeyEvent *e);
protected:
virtual void keyPressEvent(QKeyEvent *event);
};
QSGameBoard является моим подклассом QWidget, и я должен переопределить keyPressEvent и запустить СИГНАЛ в каждое событие для уведомления некоторых зарегистрированных объектов.
Мой переопределенный keyPressEvent в QSGameBoard.cpp похож на это:
void QSGameBoard::keyPressEvent(QKeyEvent *event) {
printf("\nkey event in board: %i", event->key());
//emit keyCaught(event);
}
Когда я изменяю QSGameBoard:: к QWidget:: это получает события, но я не могу испустить сигнал, потому что компилятор жалуется на объем. И если я пишу это как это, функция не становится зашедшей все.
Какова проблема здесь?
РЕДАКТИРОВАТЬ: Как отмечали другие пользователи, Метод, который я описал изначально, не является правильным способом решения этой проблемы. Ответ от Васко Ринальдо
Использование Установите FocusPolicy на Qt :: ClickFocus, чтобы получить фокус клавиатуры щелчком мыши. setFocusPolicy (Qt :: ClickFocus);
Предыдущее (хотя и несовершенное) решение, которое я дал, приведено ниже:
Похоже, ваш виджет не получает «фокус». Переопределите событие нажатия мыши:
void QSGameBoard::mousePressEvent ( QMouseEvent * event ){
printf("\nMouse in board");
setFocus();
}
Вот исходный код рабочего примера:
QSGameBoard.h
#ifndef _QSGAMEBOARD_H
#define _QSGAMEBOARD_H
#include <QWidget>
#include <QGraphicsScene>
class QSGameBoard : public QWidget {
Q_OBJECT
public:
QSGameBoard(QWidget *p, int w, int h, QGraphicsScene *s);
signals:
void keyCaught(QKeyEvent *e);
protected:
virtual void keyPressEvent(QKeyEvent *event);
void mousePressEvent ( QMouseEvent * event );
};
#endif /* _QSGAMEBOARD_H */
QSGameBoard.cpp
#include <QKeyEvent>
#include <QLabel>
#include <QtGui/qgridlayout.h>
#include <QGridLayout>
#include "QSGameBoard.h"
QSGameBoard::QSGameBoard(QWidget* p, int w, int h, QGraphicsScene* s) :
QWidget(p){
QLabel* o = new QLabel(tr("Test Test Test"));
QGridLayout* g = new QGridLayout(this);
g->addWidget(o);
}
void QSGameBoard::keyPressEvent(QKeyEvent* event){
printf("\nkey event in board: %i", event->key());
}
void QSGameBoard::mousePressEvent ( QMouseEvent * event ){
printf("\nMouse in board");
setFocus();
}
main.cpp
#include <QtGui/QApplication>
#include <QtGui/qmainwindow.h>
#include "QSGameBoard.h"
int main(int argc, char *argv[]) {
// initialize resources, if needed
// Q_INIT_RESOURCE(resfile);
QApplication app(argc, argv);
QMainWindow oM;
QGraphicsScene o;
QSGameBoard a(&oM, 1, 2, &o);
oM.setCentralWidget(&a);
a.show();
oM.show();
// create and show your widgets here
return app.exec();
}