2017-02-26 109 views
1

它應該很簡單,但不知何故它不能正常工作。我試圖捕捉eventFilter鼠標按鈕按下或釋放QListWidget。 ListWidget是在UI下編寫的。我已經安裝了eventFilter這樣QT eventFilter with MouseButtonRelease on QListWidget未檢測到鼠標按下/釋放

ui->listWidget->installEventFilter(this); 

我在頭下,增加市民:

bool eventFilter(QObject *obj, QEvent *event); 

而創建的MainWindow

bool MainWindow::eventFilter(QObject *obj, QEvent *event) 
{ 

if (event->type() == QEvent::KeyPress) 
{ 

    qDebug() << "Keyboard press"; 

} else if (event->type() == QEvent::MouseButtonRelease) { 

    qDebug() << "Mouse press L"; 

} else if(event->type() == QEvent::ContextMenu) { 

    qDebug() << "Mouse press R"; 
} 

return QObject::eventFilter(obj, event); 
} 

我的文檔檢查,這說在發送給給定的QWidget之前,每個事件都被傳遞給eventHandler。這部分是真的。因爲KeyPress和ContextMenu正在工作。即使列表小部件被設置爲blocksingals(true)。

問題是MouseButtonRelease/Press不起作用。有些東西阻止它,我不知道如何使它工作。 我也有on_listWidget_clicked,但即使擺脫它,它仍然無法正常工作。

請幫忙。由於

回答

1

有物體擋住它

這是正確的,當你按下/鬆開QListWidget你的鼠標按鈕時,QMouseEvent不會發送到QListWidget。相反,事件發送到鼠標事件發生的小部件,即QListWidgetviewport

事實上,您問題中提到的所有事件都發送到視口(因爲事件實際上是發生的)。但是由於視口忽略了它們,這些事件會傳播到視口的父窗口小部件(QListWidget),您安裝了事件過濾器並截取它們。

爲了能夠攔截在QListWidget click事件,你必須要麼子類QListWidget並覆蓋viewportEvent()(和處理你是什麼事件感興趣那裏),或者您也可以安裝你的eventfilter而不是視口

ui->listWidget->viewport()->installEventFilter(this); 
+0

太棒了!感謝它的工作:) – Pilot