[gelöst] Events werden nicht weitergeleitet

Alles rund um die Programmierung mit Qt
Antworten
Nutreon
Beiträge: 6
Registriert: 10. Juni 2009 11:03

[gelöst] Events werden nicht weitergeleitet

Beitrag von Nutreon »

Im Folgenden sind zwei Varianten zum Simulieren eines "Left-Mousebutton-Click"-Events aufgeführt. w sei hierbei ein QWidget.

Variante 1:

QMouseEvent *e = new QMouseEvent(QEvent::MouseButtonPress, QPoint(10, 10), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
QApplication::sendEvent(w, e);

Variante 2:

QTest::mousePress(w, Qt::LeftButton, Qt::NoModifier, QPoint(10, 10));

Angenommen es liegt ein Formular (QWidget) f vor, welches einen QPushButton b enthält. Soll der QPushButton b das Event erhalten, so muss ich das Event direkt an b senden. Sobald ich das Event an f schicke (der Button b befindet sich an Position 10, 10), dann wird dieses nicht an den Button hierarchisch weitergeleitet.

Es sieht so aus, als wenn ich das Event quasi eine Ebene zu tief sende, also direkt an das Formular und das Event daher nicht an seine Children weitergeleitet wird. Was sollte ich anders machen? In den Beispielen im Netz werden immer die QWidgets (z.B. Buttons) direkt angesprochen.

Edit: Eine mögliche Lösung:

Statt
QApplication::sendEvent(w, e);
einfach
QApplication::sendEvent(w->childAt(10, 10), e);
aufrufen.

Glücklicherweise ermittelt w->childAt(x, y) nicht nur das direkte child c an Position x, y des Widgets w, sondern schaut anscheinend gleich rekursiv innerhalb von c nach, ob ein in c integriertes, sichtbares Widget an dieser Position enthalten ist.
Daraus ergibt sich, dass w->childAt(x, y) das Widget ermittelt, welches in der Objekt-Hierarchie von w an Position x, y am "tiefsten" liegt. Genau das, was ich wollte :)

Falls jemand eine andere, noch allgemeinere Lösung kennt, bitte diese posten! Danke.

Edit2: Ein weiteres Problem

Meine vorherige Lösung ermittelt zwar das gewünschte Widget, aber dennoch ist die genaue Position innerhalb dieses Widgets nicht bekannt. Dieses besagte Widget könnte ja theoretisch ein child des childs des childs... von w sein. Und die Position, die über das Event übertragen werden muss, müsste rein theoretisch noch umgerechnet werden aus der Position innerhalb des Formulars f, welche bekannt ist.

Edit3: Vollständige Lösung

Ich hab nun alle Probleme lösen können:

Z01 QPoint p = QPoint(110, 105);
Z02 QWidget *w = f->childAt(p);
Z03 QPoint m = w->mapFrom(f, p);
Z04 QMouseEvent *e = new QMouseEvent(
QEvent::MouseButtonPress, m, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
Z05 QApplication::sendEvent(w, e);

Das Form sei weiterhin als f bezeichnet.
p (Zeile Z01) ist der Punkt im Form-Koordinatensystem, an welcher das Event e erzeugt werden soll. An Position (100, 100) befindet sich ein sichtbarer Button b, welcher eine Größe von 50x20 besitzt. Dieser Button überdeckt damit den Punkt p.
Zeile 02 ermittelt, wie oben beschrieben, das sichtbare Widget w, welches sich an Position p befindet und sich in der Objekthierarchie von f am tiefsten befindet.
Zeile 03 bildet p in das Koordinatensystem von w ab. Das Ergebnis wird in m gespeichert. In diesem Beispiel ist m = (110, 105) - (100, 100) = (10, 5).
In Zeile 04 wird ein Mouse-Event erzeugt. Zu beachten ist hierbei, dass nicht die Position p, sondern m verwendet werden muss.
In Zeile 05 wird letztendlich das Event e an w geschickt.
Zuletzt geändert von Nutreon am 14. April 2010 14:28, insgesamt 5-mal geändert.
Nutreon
Beiträge: 6
Registriert: 10. Juni 2009 11:03

Beitrag von Nutreon »

Ich hab nun eine Lösung gefunden.
Antworten