2011-12-22 254 views
5

无关信息: 我正在尝试使用Qt构建应用程序。此应用程序具有QMdiArea和一个子窗口。我的孩子窗口将有一个菜单,可以将其整合到QMdiArea中,也可以将其分隔并粘贴到孩子身上。虽然,这比需要更多的细节......Qt - 删除快捷方式 - 模糊的快捷方式超载

问题: 我想我的孩子 - 小部件有一个快捷键,菜单“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.一些关键-COMBO接收和事件抛出。用W,它永远不会发生。我也尝试将event移动到QMainWindow以及子窗口中的eventFilter到QMdiArea。从QMdiArea中删除默认的关键处理程序这样简单的操作似乎有些过于复杂。

回答

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; 
} 
+0

那么,有没有办法禁用快捷方式创建QMdiArea?基本上,如果我想使用快捷键,我必须在两者之间使用信号/插槽连接。 – Serodis 2011-12-22 13:30:37

+0

另外,如果这绝对是唯一的方法,那么离开模棱两可的捷径会有什么伤害吗? IE:在窗口小部件菜单上安装快捷方式?我真的不想牺牲菜单栏中的“Ctrl + W”快捷方式提醒,因为这是告诉用户快捷方式功能的最佳方式。 – Serodis 2011-12-22 13:46:02

+0

要改变'QMdiArea'关于特定关键事件的默认行为,就是对它进行子类化并重新实现'keyPressEvent()'。另一种方法是使用事件过滤器。 – Arlen 2011-12-22 21:57:51

2

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

QMdiSubWindow *subWindow2 = mdiArea.addSubWindow(internalWidget2, 
               Qt::Widget | Qt::CustomizeWindowHint | 
               Qt::WindowMinMaxButtonsHint); 
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())); 
0

可以禁用这个快捷方式是这样的:

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