Qt - 删除快捷方式 - 不明确的快捷方式重载

时间:2011-12-22 03:01:55

标签: c++ qt qmdiarea

无关信息: 我正在尝试使用Qt构建应用程序。此应用程序具有QMdiArea和子窗口。我的子窗口将有一个菜单,可以集成到QMdiArea或隔离并附加到孩子本身。但是,这比需要的更详细......

问题: 我希望我的child-widget有一个带有快捷键的菜单,“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以及子窗口中的eventFilter移动到QMdiArea。看起来做一些像QMdiArea中删除默认键处理程序一样简单的事情有点过于复杂。

5 个答案:

答案 0 :(得分:2)

在添加子窗口时,您可以使用QMdiSubWindow作为附加标记来完全摆脱Qt::CustomizeWindowHint的预定义关闭操作。

QMdiSubWindow *subWindow2 = mdiArea.addSubWindow(internalWidget2, 
                                                 Qt::Widget | Qt::CustomizeWindowHint | 
                                                 Qt::WindowMinMaxButtonsHint);

答案 1 :(得分:1)

您可以像这样禁用此快捷方式:

for( QAction *action : subWindow->systemMenu()->actions() ) {
    if( action->shortcut() == QKeySequence( QKeySequence::Close ) ) {
        action->setShortcut( QKeySequence() );
        break;
    }
}

答案 2 :(得分:0)

子类QMdiArea并重新实现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;
 }

答案 3 :(得分:0)

据我所知,我正在寻找的东西不可能没有写我自己的MDIArea。

  

The shortcut is set in QMdiSubWindowPrivate::createSystemMenu() during the construction of a QMdiSubWindow, I doubt that you can remove it without having to patch Qt libs.

希望在某些时候有人会反驳这一点,否则QT会做出改变。同时,看起来我们都需要远离这些预先指定的捷径。

答案 4 :(得分:0)

通过为我的关闭操作设置快捷方式上下文,我能够解决这个问题。通过将其设置为Qt::WidgetShortcut,我不再获得模糊的快捷方式重载。以下是我现在正在设置我的近距离行动的方式:

  closeAction = new QAction(tr("&Close"), this);
  closeAction->setShortcut(Qt::CTRL|Qt::Key_W);
  closeAction->setShortcutContext(Qt::WidgetShortcut);
  connect(closeAction, SIGNAL(triggered()), mdiArea, SLOT(closeActiveSubWindow()));