gpt4 book ai didi

c++ - 许多小部件似乎对空格键按下事件都有默认行为。如何在不子类化每个小部件的情况下覆盖它?

转载 作者:行者123 更新时间:2023-12-03 12:49:50 26 4
gpt4 key购买 nike

我有一段非常具体的代码,当按下空格键时,无论 GUI 中发生了什么,都需要立即执行。我的每个按键事件过滤器中都有以下代码片段:

    else if(keyPressed == Qt::Key_Space){
emit sigHalted();
}

这工作正常,除非某些小部件具有焦点。引起我问题的是:QTableWidgetQPushButton

如果我在 QTableWidget 中编辑,并且按下空格键,那么它会向 QTableWidget 中的项目添加一个空格键,而不是执行上面的代码。如果我用鼠标单击一个按钮,然后按空格键,则就像我再次单击同一按钮,而不是执行上面的代码。

我知道我可以通过子类化小部件并覆盖它们的事件过滤器来修复此行为,但我更愿意避免这种情况,因为我有很多按钮和表格,我必须仔细检查并将它们全部替换为新的子类版本。有没有办法可以在空格键按键事件进入小部件的默认行为之前捕获它?

最佳答案

您必须使用eventFilter

  • 启用事件:

代码:

#include <QApplication>
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
qApp->installEventFilter(this);
}
  • 声明函数:

代码:

bool eventFilter(QObject *watched, QEvent *event);
  • 重写函数:

代码:

bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{

if (event->type() == QEvent::KeyPress){
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Escape){
//your code here
emit sigHalted();
return true;
}
else{
return false;
}
}
else
return QMainWindow::eventFilter(watched,event);
}

关于c++ - 许多小部件似乎对空格键按下事件都有默认行为。如何在不子类化每个小部件的情况下覆盖它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42377439/

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