无关信息:我正在尝试使用Qt构建一个应用程序。这个应用程序具有qmediarea和子窗口。我的子窗口将有一个菜单,可以集成到qmadiarea或分离并附加到子窗口本身。虽然,这是比需要更多的细节…
问题:我希望我的子部件有一个带有快捷键"CTRL+ w"的菜单。但是,因为我使用的是QMdiArea,快捷方式已经被使用,导致:
QAction::eventFilter:模糊快捷方式重载: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以及qmediarea子窗口中的eventFilter。从QMdiArea中删除默认的键处理程序似乎有点过于复杂。
你可以像这样禁用这个快捷方式:
for( QAction *action : subWindow->systemMenu()->actions() ) {
if( action->shortcut() == QKeySequence( QKeySequence::Close ) ) {
action->setShortcut( QKeySequence() );
break;
}
}
您可以通过在添加子窗口时使用Qt::CustomizeWindowHint
作为附加标志来完全摆脱QMdiSubWindow
的预定义关闭动作。
QMdiSubWindow *subWindow2 = mdiArea.addSubWindow(internalWidget2,
Qt::Widget | Qt::CustomizeWindowHint |
Qt::WindowMinMaxButtonsHint);
子类qmediarea并重新实现keyPressEvent()
。应该可以。
void keyPressEvent(QKeyEvent* event){
if(event->key() == Qt::Key_W and event->modifiers() & Qt::ControlModifier){
// handle it
}else{
return QMdiArea::keyPressEvent(event);
}
}
你也可以使用事件过滤器。我不太了解你的类层次结构,但我希望你能明白。
bool CustomMdiArea::eventFilter(QObject *object, QEvent *event){
if(object == yourChildWindow && event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
if(keyEvent->key() == Qt::Key_W and keyEvent->modifiers() & Qt::ControlModifier) {
//handle it
return true;
}else{
return false;
}
}
return false;
}
据我所知,我所寻找的是不可能编写自己的MDIArea
快捷方式在QMdiSubWindowPrivate::createSystemMenu()中设置QMdiSubWindow的构造,我怀疑您是否可以删除它而无需修补Qt库。
希望在某个时候有人会反驳这一点,或者QT会做出改变。同时,看起来我们都需要远离这些预先分配的快捷方式。
我可以通过为close动作设置快捷上下文来解决这个问题。通过将其设置为Qt::WidgetShortcut
,我不再得到模棱两可的快捷方式过载。下面是我现在设置close动作的方法:
closeAction = new QAction(tr("&Close"), this);
closeAction->setShortcut(Qt::CTRL|Qt::Key_W);
closeAction->setShortcutContext(Qt::WidgetShortcut);
connect(closeAction, SIGNAL(triggered()), mdiArea, SLOT(closeActiveSubWindow()));