- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试在 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/
我正在编写一个简单的 GUI,它将在特定点打开一个 opencv 窗口。这个窗口有一些非常基本的 keyEvents 来控制它。我想通过一些功能来推进这一点。因为我的 QtGui 是我的 Contro
我无法理解 keyPressEvent 方法在该程序中的工作原理。具体来说,这里的“e”是什么? keyPressEvent 是使用预先存在的实例“e”重新定义的方法吗? import sys fro
我对 KeyPressEvent 有疑问, 我需要移动一个 QGraphicsItem播放器在我的场景中,但程序没有使用函数KeyPressEvent类game 文件“game.h”: #ifndef
我在QT上写作。 OpenGL 已连接,工作正常,但事件和 keyPressEvent mousePressEvent 不响应击键。 class MainWindow : public QGLWidg
我正在尝试在 Qt 上创建一个玩家可以沿对角线前进的游戏。所以当我按下 W 和 D 时,玩家可以转到右上角。但是,当我先按 W,然后按 D,然后松开 D 时,播放器不会朝 W 方向移动。事实上,按住
` from PyQt5.QtCore import Qt import sys from PyQt5.QtWidgets import QApplication, QMainWindow from
我想声明一个 com.google.gwt.event.dom.client.KeyPressEvent。它应该匹配任何字符或数字,以及 ,.-+~ 等符号。特别是我想排除所有“导航”键,如箭头、插入
我需要生成键盘输入,因为我有一个事件附加到此输入。我试着打电话: keyPressEvent(Qt::Key_Delete); 没有成功,有没有办法生成这个 keyPressEvent ? 最佳答案
我正在创建一个绘制颜色的程序,然后另一个类检查它们并在它们匹配时返回 true。整个代码都在一个对话框中。 colQ 是一个简单存储 RGB 值和其他东西的类;我们将使用这些来获取 RGB。 colD
我写了这段代码,但是我得到了这个错误: "left of '->key' must point to class/struct/union/generic type". 考虑到 GUI 是从 QWid
我有一个程序可以捕获单个按键,然后输出被按下的键。问题是,我无法返回按下的键的值,也无法让箭头键输出任何内容。这是我的代码: myApp.h class someClass: public QDial
我有一个主窗口,我在其中建立了标准的“编辑”>“剪切/复制/粘贴”操作,菜单操作链接到 QTextEdit 的相关插槽,它是主窗口的子窗口。 主窗口有一个不同的子窗口(在拆分器的另一侧),它显示一个
我从 PyQt GPL v5.4 创建一个 UI 并使用 pyuic5 将 *.ui 文件转换为 *.py 但我不知道 keyPressEvent 在这段代码中是如何工作的!! 它应该适用于 QWid
我有一个主要的 Widget 并且在这个主要的小部件里面我有 QListWidget 和两个按钮。我已经覆盖了主小部件内的 keyPressEvent(继承自 QWidget)。当焦点不在 QList
我有一个简单的表单,其中包含一些组合、标签、按钮和一个 QTextEdit。 我尝试使用 keyPressEvent 捕捉输入或返回键,但由于某些原因我无法捕捉。然而,我也使用的 ESC 键被识别。
当我按下按键时,此代码有效,但不适用于 Print Screen 键。 void KeyHooker::keyPressEvent(QKeyEvent *event) { qDebug() k
我想通过发送 KeyEvent 将字符附加到 QLineEdit。我正在使用这样的代码: ui.myEdit->setFocus(); for(size_t i = 0; i myEdit->setT
某些小部件将允许我这样做: self.widget.clicked.connect(on_click) 但是在做: self.widget.keyPressEvent.connect(on_key)
我正在尝试在 QT 中重写 QWidgets keyPressEvent 函数,但它只是行不通。我不得不说我是 CPP 的新手,但我知道 ObjC 和标准 C。 我的问题是这样的: class QSG
在我们的应用程序中,有一个用户控件,它允许输入一个数字(在 numericupdown 内),然后是一个 组合框,它允许选择 SI 前缀( [p, n, µ, m, -, k, M, G, T] 从小
我是一名优秀的程序员,十分优秀!