2012-07-19 57 views
1

我有一個對話框繼承QDialog。該對話框包含許多小部件,包括Qbuttons,QLabel,QGraphicsView等。許多小部件(如按鈕)可在焦點聚焦時處理SPACE按鍵事件。現在我不希望任何子部件處理它,但讓主對話框完成。由於主對話框中有很多小部件,所以我沒有爲它們設置intallEventFilter,而是針對qApp。如何使Qt對話框處理關鍵事件而不是其所有的子部件?

代碼如下:

QApplication app(argc, 0); 
MyDialog *pDlg = new MyDialog(...); 
qApp->installEventFilter(pDlg); 
app.exec(); 

而且eventfilter主對話框:

bool MyDialog::eventFilter(QObject *obj, QEvent *e) 
{ 
    if(e->type() == QEvent::KeyPress) 
    { 
     QKeyEvent *ke = static_cast<QKeyEvent*>(e); 
     if (ke->key == Qt::Key_Space && !ke->isAutoRepeat()) 
     { 
      // do my things in the main dialog 
      return true; 
     } 
    } 
    return qApp->eventFilter(watched, event); 
} 

不幸的是,使用此代碼後,主對話框的佈局奇怪的是,似乎有些小部件不記得自己規模政策。也許一些Qt調整大小或重繪事件沒有處理?任何人都可以告訴我如何捕捉主對話框中的關鍵事件,但不影響其他功能?

回答

0

基本上,如果您在Qt中開發基於對話框的應用程序,默認情況下按鍵事件被主對話框類捕獲,前提是您在主類中定義了keypressevent。

編輯 使用postevent()爲此目的

在你的孩子部件按鍵事件做

void childwdgt::keyPressEvent(QKeyEvent *e) 
{ 
if (e->type() == QEvent::KeyPress) 
{ 
    { 
     QKeyEvent* newEvent = new QKeyEvent(QEvent::KeyPress,e->key(), e->modifiers()); 
     qApp->postEvent (yourParentWdgt, newEvent, 0); 
    } 
} 

同樣可以處理其它類型的關鍵事件也。

+0

如果一個窗口小部件(例如按鈕)獲得焦點,然後按下按鍵,則焦點窗口小部件的keyPress事件將被調用,並且不會處理其父窗口。我想也許qApp將事件發送到正確的目的地(重點小工具)。 – Royt 2012-07-19 16:24:32

+0

我編輯了我的答案,檢查出來。 – ScarCode 2012-07-20 03:32:59

+0

感謝您的回覆。 OverWrite兒童小部件的事件處理方法或安裝事件過濾器可以做。但在主要的diloag中,有很多小部件,所以會寫很多代碼,並且結構不好。我想我應該處理所有事件都準備好派發的關鍵事件。 – Royt 2012-07-20 06:26:28

相關問題