2016-12-20 3 views
1

Die C++ API hat QEvent zusammen mit mehreren anderen davon abgeleiteten Klassen (QMouseEvent, QGestureEvent usw.). QML hat dagegen auch Ereignisse. Ich habe jedoch Schwierigkeiten, eine elegante Methode zur direkten Verarbeitung von C++ - Ereignissen in QML zu finden.Behandlung von Qt C++ Ereignissen im QML Kontext

Regel, was ich tun ist, I eine benutzerdefinierte QQuickWidget (oder ähnliches einschließlich QQmlEngine) erstellen, überschreiben die QWidget::event(QEvent* event) und auf einer bestimmten C++ Ereignis Empfangen ich es durch Signale auf QML Schlitze mit dem QML Code breiten sich durch dieses Widget geladen wird. Das scheint eine Menge Arbeit zu sein und ich frage mich, ob es eine Art von QML-eingebauter Ereignisbehandlung für Ereignisse gibt, die aus C++ - Kontext kommen.

Insbesondere bin ich daran interessiert, QGestureEvent s in QML zu behandeln, aber ich denke, was für diese Art von Ereignissen funktioniert sollte auch für jede andere Art von Ereignis funktionieren.

+0

Haben Sie versucht, [MultiPointTouchArea] (http://doc.qt.io/qt-5/qml-qtquick-multipointtoucharea.html) zu verwenden? Es hat ein Signal "Geste Gestartet (GestureEvent Geste)", das vielleicht Ihre Bedürfnisse beantworten könnte. – dydil

+0

Die Sache ist, ich möchte Gestenereignisse erfassen, die wirklich aus einem C++ - Kontext stammen. Zum Beispiel, wenn ich Daten von einem Gerät (auf das nur über C++ zugegriffen werden kann) auf die Gesten-API von Qt abbilde und sie dann an den QML-Teil der Anwendung weitergebe. Es ist möglicherweise nicht einmal per Fernbedienung verbunden (z. B. Gesten mit einem Kinect-Gerät). – rbaleksandar

+0

"Dies scheint eine Menge Arbeit" - es ist buchstäblich ** nichts ** im Vergleich zu der Menge an Arbeit, die es dauern würde, um C++ Event Handling für QML zu implementieren. – dtech

Antwort

1

Es gibt keine direkte Unterstützung für die Ereignisbehandlung in QML, auch Tastatur und Maus sind über Hilfsobjekte zugänglich.

QEvent selbst ist kein QObject abgeleitet, und als solches gilt das gleiche für alle abgeleiteten Ereignisse auch. Das bedeutet keine Meta-Informationen und keine einfache Verwendung von QML.

Da Sie an einem bestimmten Ereignistyp interessiert sind, wäre es am einfachsten, ein eigenes Hilfsobjekt für diese Art von Ereignissen zu erstellen, es in C++ zu implementieren und es über Signale, denen Sie Handler zuordnen können, mit QML zu verbinden.

+0

Ok, dies scheint eine No-go-Situation in Bezug auf eine einfache Lösung zu sein. Das bestätigt zumindest meine Befürchtung, dass ich Ereignisdaten durch Signale an QML-Slots weiterleiten muss. Vielen Dank. Ich muss mich allerdings fragen, wie auf der Erde QML-Ereignisse implementiert werden.Es scheint, dass diese nicht auf 'QEvents' basieren, sondern auf etwas anderem ... – rbaleksandar

+1

@rbaleksandar - wie die Antwort erwähnt, geschieht dies durch Hilfsobjekte. Zum Beispiel 'MouseArea', das nur für Maus- und Single-Touch-Ereignisse gedacht ist. – dtech

+0

Ah, ja. Das tut mir leid. Vielen Dank. Ich denke, ich könnte das tun und sehen, wie es funktioniert. – rbaleksandar

1

Wenn QGestureEvent kann kopieren konstruierten Sie einfach einen Q_GADGET basierten Adapter schaffen könnte:

class QmlGestureEvent : public QGestureEvent 
{ 
    Q_GADGET 
    Q_PROPERTY(...) // for the things you want to access from QML 

public: 
    QmlGestureEvent(const QGestureEvent &other) : QGestureEvent(other) {} 
}; 

Wenn es nicht kopier konstruierbar wird Sie Datenelemente an den Adapter hinzufügen müssen, und kopieren Sie die Werte von das Ereignis.

+1

Keine Ereignisse unterstützen die Erstellung von Kopien. Dies ist eine Quelle für signifikante Hackereien, die benötigt werden, um z.B. das System der Staatsmaschine. Qt implementiert daher intern an einigen Stellen das Klonen von Ereignissen. Hoffentlich wird es für Qt 6 aufgeräumt. –

+0

@KubaOber ah, ich verstehe. Ich habe gerade gesehen, dass 'QEvent' selbst einen Kopierkonstruktor hatte und' QGestureEvent' schien es nicht zu löschen, also stellte ich mir vor, dass der Compiler ein Standardverzeichnis erstellen würde, das die Basisklasse aufruft und dann das Element für die Daten des abgeleiteten Typs –

+0

kopiert Sagen wir so: Es gibt einen Kopierkonstruktor. Aber es wird nicht unterstützt. Sie müssen Qt-Code überwachen, um sicherzustellen, dass alle Ereignisse, die Sie kopieren möchten, kopierbar sind. Ein weiteres Problem besteht darin, dass ein konkreter Ereignistyp zwar kopierbar sein kann, dass aber ein virtueller Kopierkonstruktor (ein "Klon", der "QEvent" benötigt) wirklich benötigt wird. –

Verwandte Themen