[gelöst]wie fängt man Key-Events auf einem Grafikfeld ab

Alles rund um die Programmierung mit Qt
Antworten
qtNiko
Beiträge: 216
Registriert: 6. April 2007 21:26
Wohnort: München

[gelöst]wie fängt man Key-Events auf einem Grafikfeld ab

Beitrag von qtNiko »

hi,

mein Programm soll zeitliche Abläufe innerhalb eines Systems in Form eines Balkendiagramms in einem neu erzeugten Fenster darstellen.
Ein QTableWidget am linken Rand dieses Fensters enthält die Liste der Vorgänge. Auf einem QLabel rechts daneben sollen die Balken angezeigt werden, die auf ein QPixmap gezeichnet und dann mit setPixmap() auf dem QLabel sichtbar gemacht werden. Dieses Fenster wird als QDialog erzeugt.

Es soll möglich sein, mit den Pfeiltasten links/rechts durch die Vorgänge zu steppen.
Im constructor von QDialog wird ein Eventfilter eingerichtet:

Code: Alles auswählen

...
uidg.label_graph->installEventFilter(this);      // QLabel zum Anzeigen der Grafik
uidg.tableW_logtype->installEventFilter(this);   // QTableWidget für die Vorgangsliste
...
Das Problem:
Nach dem Erzeugen der Grafik im QDialog-Fenster erhält das Eventfilter keinerlei key-events, egal welche Tasten man drückt, und auch nicht nach Klick auf das Grafikfeld.
Erst nachdem man ein Element in der Tabelle (QTableWidget) angeklickt hat, werden key-events erkannt. Das wäre noch akzeptabel, aber die Tasten links/rechts führen dazu, dass neben der aktuell markierten Zeile der Tabelle stets eine feste, weitere Zeile markiert wird. Es sind dann immer zwei Zeilen der Tabelle markiert, obwohl der selectionmode der Tabelle SingleSelection ist. Dies stört außerdem, weil die markierte Zeile anzeigen soll, welches der aktuelle Vorgang ist.

Es müsste also gelingen, die Pfeiltasten zu erkennen, ohne dass man vorher auf die Tabelle klicken muss.
Wie geht das?
---------------------------
Lösung:
Der Tipp mit Fokus setzen hat geholfen.
Dennoch war es ein ziemlich langes Herumprobieren, bis es so lief, wie ich es wollte.
Es schwirren allerlei diverse Messages herum, die vom Eventfilter aufgeschnappt werden. Teilweise verursachte ein einzelner Tastendruck das dreifache Aufrufen der zugehörigen Slot-function und dgl.
Mir ist z.B. nicht klar geworden, was den Unterschied ausmacht, ob das Eventfilter mit "return false" oder "return QDialog::eventFilter(obj, event)" beendet wird.
Zuletzt geändert von qtNiko am 20. Februar 2015 19:27, insgesamt 1-mal geändert.
Gruß von qtNiko

Core i5 760, GT 240, Suse Linux11.3, Eclipse-CDT-Helios, QT4.4, QT-Integration
odt
Beiträge: 128
Registriert: 12. August 2010 11:49
Kontaktdaten:

Re: wie fängt man Key-Events auf einem Grafikfeld ab

Beitrag von odt »

Problem 1: Vermutlich hat der Dialog oder ein anderes Widget den Fokus. Versuch mal den installEventFiler auch auf this (Dialog) oder den Fokus explizit zu setzen.
Problem 2: QTableView/Widget kenne ich zu wenig, nur eine Vermutung: Fokus und Selection.
ODT Informatik GmbH, Reto Tschofenig
Antworten