Qt -删除快捷方式-模糊的快捷方式过载



无关信息:我正在尝试使用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()));

相关内容

  • 没有找到相关文章

最新更新