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
...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.