QWidget keyPressEvent override [英] QWidget keyPressEvent override

查看:203
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆