无关信息: 我正在尝试使用Qt构建一个应用程序。这个应用程序包含一个QMdiArea和一个子窗口。我的子窗口将有一个菜单,可以集成到QMdiArea中,也可以分离并附加到子窗口本身。不过,这些细节不是必要的...
问题: 我想让我的子窗口小部件具有一个带有快捷键“CTRL+W”的菜单。但是,由于我正在使用QMdiArea,该快捷键已被使用,导致出现以下问题:
QAction::eventFilter: Ambiguous shortcut overload: Ctrl+W
如何摆脱这个快捷键并在我的子窗口小部件中声明它?
更新: 这是我尝试过但没有成功的方法:
class MDI : public QMdiArea
{
Q_OBJECT
private:
bool event(QEvent *tEvent)
{
if (tEvent->type() == QEvent::KeyPress)
{
QKeyEvent* ke = static_cast<QKeyEvent*>(tEvent);
if (ke->key()== Qt::Key_W && ke->modifiers() & Qt::ControlModifier)
emit KeyCW();
return true;
}
return QMdiArea::event(tEvent);
}
public:
signals:
void KeyCW();
};
这个方法能够成功,如果我只是像把
Qt::Key_W
改为 Qt::Key_L
这样简单的操作。快捷键会被接收并触发事件。但是使用 W 的时候,它永远都不会发生。我也尝试了将 event
移动到 QMainWindow 中,以及将 eventFilter 移动到 QMdiArea 的子窗口中。似乎这里有点过于复杂,仅仅想要从 QMdiArea 中移除默认的按键处理就显得有些简单了。
QMdiArea
在特定键事件方面的默认行为是通过对其进行子类化并重新实现keyPressEvent()
。另一种方法是使用事件过滤器。 - Arlen