2011-12-22 250 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; 
    } 
}