2012-04-19 73 views
1

我正在使用QT4並創建了一個QGLWidget,我想在其中實現右鍵單擊上下文菜單。我只想在右鍵單擊並按下CTRL鍵的情況下顯示上下文菜單。當QT上下文菜單顯示時沒有keyReleaseEvent

我試圖通過設置一個控制標誌,當按下CTRL鍵,然後清除CTRL鍵釋放(通過keyReleaseEvent)實現這一點。問題是,當上下文菜單啓動時,我沒有收到keyReleaseEvent(不僅僅是CTRL,根本沒有發佈密鑰)。

例如:我按住CTRL,單擊鼠標右鍵,然後出現上下文菜單(仍然按住CTRL鍵)。沒有選擇菜單中的任何內容,我釋放CTRL鍵,但我的程序沒有收到keyPressEvent。因此我的旗子永遠不會被清除,並且下一次用戶右鍵單擊(即使沒有保持控制),上下文菜單也會出現。

爲什麼當上下文菜單存在時,我沒有收到keyPressEvent

我正在使用QT 4.8(C++),並在Windows和Linux上測試了這個結果。

+0

您是通過contextMenuEvent還是通過keyPressEvent打開上下文菜單? – Anthony 2012-04-19 22:28:37

+0

只是爲了澄清,你想釋放CTRL導致上下文菜單消失? – Anthony 2012-04-19 22:32:48

+0

不,我在鼠標按下事件期間通過exec直接打開它,並且我想在CTRL釋放後讓它打開。當某些東西被選中或在其他地方點擊時它應該關閉。 – 2012-04-19 23:21:24

回答

1

對於爲什麼部分,Qt將鍵盤事件發送到具有鍵盤焦點或明確抓住鍵盤的小部件(使用QWidget::grabKeyBoard()),因爲在釋放鍵時上下文菜單是該小部件,它將接收鍵發佈事件。

+0

我知道安東尼的答案就是要走的路,但是我主要是因爲這個原因才發佈的。謝謝。 – 2012-04-20 00:19:11

3

我認爲處理這種情況的最好方法就是檢查在打開上下文菜單時是否按住CTRL鍵。這樣你可以避免這些問題,並且不必跟蹤該標誌。試試這個:

void DerivedClass::mousePressEvent(QMouseEvent *event) 
{ 
    if (event->button() == Qt::RightButton && event->modifiers().testFlag(Qt::ControlModifier)) 
    { 
     // Open the context menu. 
    } 
    else 
    { 
     BaseClass::mousePressEvent(event); 
    } 
} 

編輯:這是Qt :: ControlModifier,而不是Qt :: CtrlModifier。

+0

我知道我做錯了。謝謝!現在效果很好。 – 2012-04-20 00:19:35