gpt4 book ai didi

c++ - QWidget keyPressEvent 覆盖

转载 作者:IT老高 更新时间:2023-10-28 21:55:33 26 4
gpt4 key购买 nike

我正在尝试在 QT 中重写 QWidgets keyPressEvent 函数,但它只是行不通。我不得不说我是 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 并在每个事件上触发一个 SIGNAL 以通知一些已注册的对象。

我在 QSGameBoard.cpp 中覆盖的 keyPressEvent 如下所示:

void QSGameBoard::keyPressEvent(QKeyEvent *event) {
printf("\nkey event in board: %i", event->key());
//emit keyCaught(event);
}

当我将 QSGameBoard::更改为 QWidget::时,它会接收事件,但我无法发出信号,因为编译器会提示范围。如果我这样写,函数根本不会被调用。

这里有什么问题?

最佳答案

编辑:正如其他用户所指出的,我最初概述的方法不是解决此问题的正确方法。瓦斯科·里纳尔多

的回答

Use Set the FocusPolicy to Qt::ClickFocus to get the keybordfocus by mouse 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);

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();
}

关于c++ - QWidget keyPressEvent 覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2733668/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com