【发布时间】:2017-07-04 22:50:30
【问题描述】:
我有一个 Qt 应用程序,在 Qt Designer 表单操作中定义了多个窗口快捷方式。在焦点位于处理相同组合的小部件上(覆盖我的窗口快捷方式)时按下它们之前,快捷方式效果很好。
我希望有相反的行为:窗口快捷方式覆盖焦点小部件快捷方式。
我尝试使用eventFilter 并且可以捕获所需的事件,但我无法以调用全局快捷方式的方式重新发送它们。我可以使用大开关并自己调用操作,但我当然想避免这种情况。
我在eventFilter 中使用了postEvent 和sendEvent,使用MainWindow 作为接收器,但这些事件被忽略了:
bool MainWindow::eventFilter(QObject*, QEvent* event) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
if (keyEvent->key() == Qt::Key_Z
&& keyEvent->modifiers() == Qt::ControlModifier) {
//Calling the triggers directly works
ui->actionUndo->trigger();
return true;
} else if (keyEvent->modifiers().testFlag(
Qt::KeypadModifier)) {
QKeyEvent* ev2
= new QKeyEvent(keyEvent->type(), keyEvent->key(), 0);
qDebug() << keyEvent << ev2;
//This sendEvent doesn't work
QApplication::sendEvent(ui->widget, ev2);
event->accept();
return true;
} else {
return false;
}
}
return false;
}
【问题讨论】:
-
您只需要使用
QShortcut和Qt::ApplicationShortcut上下文。或者我不明白你的逻辑和你想要做什么。 -
您是否尝试过发帖到
qApp而不是某个小部件? -
@DmitrySazonov 我试过 Qt::ApplicationShortcut 结果是一样的
-
@king_nak 我也试过了,同样... :(
-
sendEvent 中的 0 不正确吗?据说它是一个Qt::KeyboardModifiers,这可能就是你的重新发送事件没有得到正确处理的原因吗?意思是,您检查收到的事件是否有一个,然后重新发送没有它的新事件。
标签: qt