Qt-Rechtsklick auf mouseReleaseEvents nicht gefangen eventfilter,andere Ereignisse aber sind gefangen
Meine Anwendung besteht aus einer WebView-widget. Ein Klick auf das widget wird nicht behandelt, indem die mousePressEvent() meiner Anwendung, aber durch das WebView-widget. So, ich installierte einen ereignisfilter, der die Ereignisse empfangen. Nun bekomme ich mitgeteilt, alle Veranstaltungen, mit Ausnahme der mouseReleaseEvent für das Recht auf (Alles funktioniert für Links-Klicks und mousePressEvent für die Rechte Maustaste ist auch immer registriert). Ich denke, es hat etwas zu tun mit dem Zusammenhang von Ereignissen zu bekommen, erzeugt durch richtige Klicks (ein pop-up-Menü generiert wird). Aber da bin ich mit einem filter, der Fall sollte zuerst an mich. Der folgende code ist der code für den event-filter
in Jambi, aber ich hoffe ich kann das ändern einer Antwort in Qt für Jambi.
public boolean eventFilter(QObject o,QEvent event)
{
if (event.type()==QEvent.Type.MouseButtonPress) //One can call the mousePressEvent() functions from here,which can do this work but speed
{
if (((QMouseEvent)event).button()==Qt.MouseButton.LeftButton)
{
mousebuttontype=1;
clickedorpressed=1;
}
else
if (((QMouseEvent)event).button()==Qt.MouseButton.RightButton)
{
mousebuttontype=2;
System.out.println("right");
}
t1=QTime.currentTime();
t1.start();
}
else
if (event.type()==QEvent.Type.MouseButtonRelease)
{
if (t1.elapsed()>900)
{
switch(mousebuttontype)
{
case 1: browser.back();
break;
case 2: browser.forward();
break;
}
}System.out.println("choda");
}
return false;
}
MEIN GRUNDLEGENDES ZIEL IST IMMER DER ZEITRAUM, FÜR DEN SIE DIE RECHTE MAUSTASTE GEDRÜCKT WURDE. ABHILFE ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Graben um sicher zu suggerieren scheint, dass es möglicherweise nicht die Rechte-Maus-release-event wird generiert, wenn das der Auslöser für ein Kontext-Menü auf Ihrem system. Diese vermittelt werden als QContextMenuEvent.
Diese Qt-Labs post Hinweise über diesen auch.
Einem umgehen kann tückisch sein, wenn es system abhängig ist. Haben Sie versucht, übergeordnete Veranstaltung() in der Klasse QApplication zu sehen, wenn das Ereignis kommt es durch? Einige Ereignisse nicht unbedingt an Kinder, sondern alles geht durch QApplication::event().
Eine weitere option für Sie ist, Unterklasse Qwebview und überschreiben mouseReleaseEvent Veranstaltung
Ich gefunden habe, eine Lösung für dieses Problem, dass ich nicht glaube, ist system abhängig.
Meinem speziellen Fall war mit mouseReleaseEvent, um zu fangen die Ereignisse, und selbst nutzen. Ich habe nicht diese Ereignisse.
Auf alle Kind-widgets in der widget, das will ich behandeln Sie das Ereignis, ich Hinzugefügt, um die definition der Klasse:
Diese überschreibt die default-Implementierung aus dem Kontext-Menü ist, und sendet die mouseReleaseEvent wieder die "parent" - Kette, wie wäre es für andere mousebuttons.
http://doc.qt.io/qt-5/qevent.html#ignore
Dies zeigt, dass es wohl propagieren, um das übergeordnete widget. Wie der link zeigt, ist dieses fest für mich bei Qt 5.9, aber ich denke, es sollte funktionieren, für nahezu alle version.
(Ich bin mir bewusst, diese Frage ist buchstäblich 7 Jahre alt, aber es enthält nicht die Korrektur, die ich denke, wäre das am besten beheben, und zeigt sich als Ergebnis, 2 bei google(qt nicht immer die Maus loslassen Ereignis auf der rechten Maustaste). Also ich denke, es verdient eine aktuelle Antwort.)
Ohne dabei zu einer breiteren Umsetzung der Erklärungen den Kern des Problems, die ich brauchte, um zu lösen, die im Zusammenhang mit diesem Problem war, dass ich brauchte, um zu wissen, ob ein Kontext-Menü, verschluckt der rechten Maustaste klicken, so konnte ich sicher einige benutzerdefinierte Staat korrekt verarbeitet wurde. Die einfachste Lösung die ich finden konnte, war die Umsetzung contextMenuEvent, die aufgerufen wird, nachdem mousePressEvent, zu erkennen, ob die Veranstaltung angenommen wurde (ein Kontext-Menü geöffnet wurde irgendwo in meinem QGraphicsScene/Items). Hier ist ein minimal-Beispiel in Python, um zu demonstrieren, wie die Ereignis-Zustand eingesetzt werden können:
Hinweis: Sie können auch überspringen, laufen die der Basis-Klasse contextMenuEvent vollständig zu blockieren, die Szene/Elemente öffnen, ein Kontextmenü. Dies ist praktisch, wenn Sie wollen, um 3D-DCC-wie alt-RMB-Zoom, ohne versehentlich öffnen Sie ein Kontext-Menü, z.B.: