2017-02-26 3 views
1

Es sollte einfach sein, aber irgendwie funktioniert es nicht so, wie es sollte. Ich versuche, mit EventFilter Maustaste drücken oder auf QListWidget freigeben. ListWidget wurde unter UI vorbereitet. Ich habe diesesQT eventFilter mit MouseButtonRelease auf QListWidget erkennt keine Maus drücken/loslassen

ui->listWidget->installEventFilter(this); 

event wie installiert Ich habe öffentlich in Header hinzugefügt:

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

und erstellt unter 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); 
} 

Ich habe in der Dokumentation überprüft und es sagt, dass jedes Ereignis an eventHandler übergeben wird, bevor es an ein bestimmtes QWidget gesendet wird. Und es ist teilweise wahr. Weil KeyPress und ContextMenu funktioniert. Selbst wenn das Listen-Widget auf Blocksingals eingestellt war (true).

Das Problem ist, dass MouseButtonRelease/Press nicht funktioniert. Etwas blockiert es und ich weiß nicht, was oder wie es funktioniert. Ich habe on_listWidget_clicked auch, aber sogar loswerden es funktioniert immer noch nicht.

Bitte helfen. Dank

Antwort

1

Etwas ist blockiert

Das ist richtig, wenn Sie/drücken lassen Sie die Maustaste auf den QListWidget, The QMouseEventnicht die QListWidget gesendete. Stattdessen wird das Ereignis an das Widget gesendet, an dem das Mausereignis aufgetreten ist, dh viewport.

Tatsächlich wurden alle in Ihrer Frage genannten Ereignisse in das Ansichtsfenster gesendet (da dies der Fall war, in dem das Ereignis tatsächlich stattfand). Da das Ansichtsfenster sie jedoch ignorierte, wurden diese Ereignisse an das übergeordnete Widget des Ansichtsfensters (QListWidget) weitergegeben, wo Sie Ihren Ereignisfilter installiert und abgefangen haben.

Um in der Lage sein, das Click-Ereignis abfangen auf einem QListWidget, Sie müssen entweder Unterklasse QListWidget und außer Kraft setzen viewportEvent() (und zu handhaben, was Ereignisse, die Sie dort interessiert sind), oder Sie können Ihre event auf die Installation Ansichtsfenster statt:

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

Super! Danke, dass es jetzt funktioniert :) – Pilot

Verwandte Themen