5

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

问题: 我希望我的子小部件有一个带有快捷键“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_WQt::Key_L.键组合并引发事件,这将起作用。有了W,它就永远不会发生。我还尝试将eventQMainWindow 以及子窗口中的 eventFilter 移至 QMdiArea。做一些简单的事情,比如从 QMdiArea 中删除默认的密钥处理程序,似乎有点过于复杂。

4

5 回答 5

3

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

for( QAction *action : subWindow->systemMenu()->actions() ) {
    if( action->shortcut() == QKeySequence( QKeySequence::Close ) ) {
        action->setShortcut( QKeySequence() );
        break;
    }
}
于 2017-07-20T11:04:32.593 回答
2

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

QMdiSubWindow *subWindow2 = mdiArea.addSubWindow(internalWidget2, 
                                                 Qt::Widget | Qt::CustomizeWindowHint | 
                                                 Qt::WindowMinMaxButtonsHint);
于 2012-02-14T12:14:51.897 回答
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;
 }
于 2011-12-22T05:59:16.110 回答
0

据我所知,如果不写我自己的 MDIArea,我所寻找的东西是不可能的。

快捷方式是在 QMdiSubWindow 构建期间在 QMdiSubWindowPrivate::createSystemMenu() 中设置的,我怀疑您是否可以在无需修补 Qt 库的情况下删除它。

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

于 2011-12-24T19:00:51.297 回答
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()));
于 2012-03-28T14:10:36.210 回答