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調整大小或重繪事件沒有處理?任何人都可以告訴我如何捕捉主對話框中的關鍵事件,但不影響其他功能?
如果一個窗口小部件(例如按鈕)獲得焦點,然後按下按鍵,則焦點窗口小部件的keyPress事件將被調用,並且不會處理其父窗口。我想也許qApp將事件發送到正確的目的地(重點小工具)。 – Royt 2012-07-19 16:24:32
我編輯了我的答案,檢查出來。 – ScarCode 2012-07-20 03:32:59
感謝您的回覆。 OverWrite兒童小部件的事件處理方法或安裝事件過濾器可以做。但在主要的diloag中,有很多小部件,所以會寫很多代碼,並且結構不好。我想我應該處理所有事件都準備好派發的關鍵事件。 – Royt 2012-07-20 06:26:28