QWidget keyPressEvent override [英] QWidget keyPressEvent override
问题描述
我试图半个永恒现在覆盖QWidgets的keyPressEvent函数在QT,但它只是不会工作。我不得不说我是新的CPP,但我知道ObjC和标准C。
我的问题看起来像这样:
class QSGameBoard:public QWidget {
Q_OBJECT
public:
QSGameBoard(QWidget * p,int w,int h ,QGraphicsScene * s);
信号:
void keyCaught(QKeyEvent * e);
protected:
virtual void keyPressEvent(QKeyEvent * event);
};
QSGameBoard是我的QWidget子类,我需要重写keyPressEvent,并对每个事件触发一个SIGNAL一些注册对象。
我的覆盖的keyPressEvent在QSGameBoard.cpp看起来像这样:
void QSGameBoard :: keyPressEvent(QKeyEvent * event){
printf(板中的\\\
key事件:%i,event-> key
// emit keyCaught(event);
}
当我改变QSGameBoard ::到QWidget ::它接收事件,我不能发出信号,因为编译器抱怨的范围。
这里有什么问题?
编辑:
正如其他用户指出的,我最初概述的方法不是解决这个问题的正确方法。
由 Vasco Rinaldo 回答
使用将FocusPolicy设置为Qt :: ClickFocus以获取keybordfocus由
鼠标klick。 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);
信号:
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>
#includeQSGameBoard.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(板中的\\\
key事件:%i,event-> key ;
}
void QSGameBoard :: mousePressEvent(QMouseEvent * event){
printf(\\\
Mouse in board);
setFocus();
}
main.cpp
#include< QtGui / QApplication>
#include< QtGui / qmainwindow.h>
#includeQSGameBoard.h
int main(int argc,char * argv []){
//如果需要,初始化资源
// 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();
//创建并显示您的窗口小部件
return app.exec();
}
I'm trying for half an eternity now overriding QWidgets keyPressEvent function in QT but it just won't work. I've to say i am new to CPP, but I know ObjC and standard C.
My problem looks like this:
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 is my QWidget subclass and i need to override the keyPressEvent and fire a SIGNAL on each event to notify some registered objects.
My overridden keyPressEvent in QSGameBoard.cpp looks like this:
void QSGameBoard::keyPressEvent(QKeyEvent *event) { printf("\nkey event in board: %i", event->key()); //emit keyCaught(event); }
When i change QSGameBoard:: to QWidget:: it receives the events, but i cant emit the signal because the compiler complains about the scope. And if i write it like this the function doesn't get called at all.
What's the problem here?
解决方案EDIT: As pointed out by other users, the method I outlined originally is not the proper way to resolve this. Answer by Vasco Rinaldo
Use Set the FocusPolicy to Qt::ClickFocus to get the keybordfocus by mouse klick. setFocusPolicy(Qt::ClickFocus);
The previous (albeit imperfect) solution I gave is given below:
Looks like your widget is not getting "focus". Override your mouse press event:
void QSGameBoard::mousePressEvent ( QMouseEvent * event ){ printf("\nMouse in board"); setFocus(); }
Here's the source code for a working example:
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(); }
这篇关于QWidget keyPressEvent override的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!