2012-04-23 54 views
1

我有一個QMainWindow,安裝了一個打開QDialog的事件過濾器。 主窗口處理Enter鍵的鍵釋放。 但是,當QDialog打開並且處於焦點狀態時,按下Enter鍵時,主窗口也會捕獲此事件。QMainWindow正在處理應該被QDialog捕獲的事件

我該如何防止這種情況發生?我試圖在QDialog中安裝事件過濾器,重新實現keyReleaseEvent和keyPressEvent函數,更改父(當前爲0),但似乎沒有任何幫助...

請注意,當我更改事件過濾器在QMainWindow的,使得它處理按鍵代替鍵釋放的QDialog的工作正常,但後來我得到我想要避免其他錯誤...

bool Window::eventFilter(QObject *, QEvent *event) { 
if (type == QEvent::KeyRelease) { 
    QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event); 

    switch(keyEvent->key()) { 
    case Qt::Key_Enter: 
    // do something here 
    break; 
    default: 
    break; 
    } 
} 

Dialog::Dialog(unsigned int num, QWidget *parent) 
: QDialog(parent), num(_num) 
{ 
    ui.setupUi(this); 
    ui.btnOK->setEnabled(false); 

    connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(accept())); 
    connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(reject())); 

    installEventFilter(this); 
} 

bool Dialog::eventFilter(QObject *, QEvent *event) { 
return true; 
} 

提前感謝的

+0

你能在這裏顯示你的代碼嗎? – lazyhammer 2012-04-23 11:31:01

+0

我添加了代碼。 – kakush 2012-04-23 11:55:15

回答

2

嘗試webclectic的第一種方法,但用e->accept()代替e->ignore(),因爲ignore()的行爲與你想要達到的目的相反。

void MyDialog::keyReleaseEvent(QKeyEvent* e) 
{ 
    QDialog::keyReleaseEvent(e); 
    if (e->key() == Qt::Key_Enter) 
     e->accept(); 
} 

或者你也許應該嘗試模態對話框?

更新:如果我們希望對話框響應Enter鍵釋放,我們必須始終調用QDialog的實現。

+0

由於事件只會在else語句中傳播,因此使用'accept'還是'ignore'並不重要。由於接收者不需要這個事件,所以應該使用'ignore'函數(代碼準備就緒) – pnezis 2012-04-23 12:22:13

+2

就我所知,它確實很重要,因爲QDialog :: keyReleaseEvent(e)無法控制事件分派器。它只檢查返回/ esc的鍵碼和觸發器accept()/ reject()(如果必須的話),並將事件返回到發生傳播的調度程序。我錯了嗎? – lazyhammer 2012-04-23 12:48:47

+0

Dmitriy是正確的,調用'QDialog :: keyReleaseEvent()'只是允許執行該函數的基類的實現,它與該事件是否被傳播無關。否則就不需要接受/忽略功能。 – Chris 2012-04-23 18:21:35

相關問題