QTouchEvent Class
Die Klasse QTouchEvent enthält Parameter, die ein Berührungsereignis beschreiben. Mehr...
Kopfzeile: | #include <QTouchEvent> |
CMake: | find_package(Qt6 REQUIRED COMPONENTS Gui) target_link_libraries(mytarget PRIVATE Qt6::Gui) |
qmake: | QT += gui |
Vererbungen: | QPointerEvent |
- Liste aller Mitglieder, einschließlich geerbter Mitglieder
- Veraltete Mitglieder
- QTouchEvent ist Teil der Ereignis-Klassen.
Öffentliche Funktionen
QTouchEvent(QEvent::Type eventType, const QPointingDevice *device = nullptr, Qt::KeyboardModifiers modifiers = Qt::NoModifier, const QList<QEventPoint> &touchPoints = {}) | |
QObject * | target() const |
QEventPoint::States | touchPointStates() const |
Reimplementierte öffentliche Funktionen
virtual bool | isBeginEvent() const override |
virtual bool | isEndEvent() const override |
virtual bool | isUpdateEvent() const override |
Detaillierte Beschreibung
Aktivieren von Berührungsereignissen
Berührungsereignisse treten auf, wenn ein oder mehrere Berührungspunkte auf einem Berührungsgerät (z. B. einem Touchscreen oder Trackpad) gedrückt, losgelassen oder bewegt werden. Um Berührungsereignisse zu empfangen, muss bei Widgets das Attribut Qt::WA_AcceptTouchEvents und bei Grafikelementen das Attribut acceptTouchEvents auf true gesetzt sein.
Wenn Sie QAbstractScrollArea basierte Widgets verwenden, sollten Sie das Qt::WA_AcceptTouchEvents Attribut auf dem viewport des Scrollbereichs aktivieren.
Ähnlich wie bei QMouseEvent erfasst Qt automatisch jeden Berührungspunkt beim ersten Drücken innerhalb eines Widgets, und das Widget erhält alle Aktualisierungen für den Berührungspunkt, bis er losgelassen wird. Beachten Sie, dass es möglich ist, dass ein Widget Ereignisse für zahlreiche Berührungspunkte empfängt, und dass mehrere Widgets gleichzeitig Berührungsereignisse empfangen können.
Ereignisbehandlung
Alle Berührungsereignisse sind vom Typ QEvent::TouchBegin, QEvent::TouchUpdate, QEvent::TouchEnd oder QEvent::TouchCancel. Reimplementieren Sie QWidget::event() oder QAbstractScrollArea::viewportEvent() für Widgets und QGraphicsItem::sceneEvent() für Elemente in einer Grafikansicht, um Berührungsereignisse zu empfangen.
Im Gegensatz zu Widgets empfangen QWindows Berührungsereignisse immer, es besteht keine Notwendigkeit, sich dafür zu entscheiden. Wenn Sie direkt mit QWindow arbeiten, genügt es, QWindow::touchEvent() zu reimplementieren.
Die Ereignisse QEvent::TouchUpdate und QEvent::TouchEnd werden an das Widget oder Element gesendet, das das Ereignis QEvent::TouchBegin akzeptiert hat. Wenn das QEvent::TouchBegin Ereignis nicht akzeptiert und nicht durch einen Ereignisfilter gefiltert wird, werden bis zum nächsten QEvent::TouchBegin keine weiteren Berührungsereignisse gesendet.
Einige Systeme können ein Ereignis des Typs QEvent::TouchCancel senden. Beim Empfang dieses Ereignisses werden die Anwendungen aufgefordert, die gesamte aktive Berührungssequenz zu ignorieren. In einem zusammengesetzten System kann der Compositor zum Beispiel entscheiden, bestimmte Gesten als systemweite Gesten zu behandeln. Wann immer eine solche Entscheidung getroffen wird (die Geste wird erkannt), werden die Clients mit einem QEvent::TouchCancel -Ereignis benachrichtigt, damit sie ihren Status entsprechend aktualisieren können.
Die Funktionen pointCount() und point() können verwendet werden, um auf einzelne Berührungspunkte zuzugreifen und diese zu wiederholen.
Die Funktion points() gibt eine Liste aller im Ereignis enthaltenen Berührungspunkte zurück. Beachten Sie, dass diese Liste leer sein kann, zum Beispiel im Falle eines QEvent::TouchCancel Ereignisses. Jeder Punkt ist eine Instanz der Klasse QEventPoint. Das QEventPoint::State enum beschreibt die verschiedenen Zustände, die ein Berührungspunkt haben kann.
Hinweis: Die Liste von points() ist niemals unvollständig: Ein Berührungsereignis enthält immer einen Berührungspunkt für jeden vorhandenen physischen Berührungskontakt, der auf das Fenster oder Widget zielt, an das das Ereignis gesendet wird. Angenommen, alle Berührungen zielen auf dasselbe Fenster oder Widget, dann bedeutet ein Ereignis mit der Bedingung points().count()==2 garantiert, dass die Anzahl der Finger, die den Touchscreen oder das Touchpad berühren, genau zwei beträgt.
Ereigniszustellung und -weiterleitung
Standardmäßig übersetzt QGuiApplication den ersten Berührungspunkt in einem QTouchEvent in ein QMouseEvent. Dies ermöglicht die Aktivierung von Berührungsereignissen in bestehenden Widgets, die normalerweise nicht mit QTouchEvent umgehen. Siehe unten für Informationen über einige spezielle Überlegungen, die in diesem Fall notwendig sind.
QEvent::TouchBegin ist das erste Berührungsereignis, das an ein Widget gesendet wird. Das Ereignis QEvent::TouchBegin enthält ein spezielles Akzeptieren-Flag, das anzeigt, ob der Empfänger das Ereignis wünscht. Standardmäßig wird das Ereignis akzeptiert. Sie sollten ignore() aufrufen, wenn das Berührungsereignis nicht von Ihrem Widget verarbeitet wird. Das Ereignis QEvent::TouchBegin wird in der Kette der übergeordneten Widgets weitergegeben, bis ein Widget es mit accept() annimmt oder ein Ereignisfilter es verbraucht. Bei QGraphicsItems wird das QEvent::TouchBegin Ereignis an Elemente unter der Maus weitergegeben (ähnlich der Weitergabe von Mausereignissen bei QGraphicsItems).
Gruppierung von Berührungspunkten
Wie bereits erwähnt, ist es möglich, dass mehrere Widgets gleichzeitig QTouchEvents empfangen können. Qt stellt jedoch sicher, dass niemals doppelte QEvent::TouchBegin Ereignisse an dasselbe Widget gesendet werden, was theoretisch während der Ausbreitung passieren könnte, wenn z.B. der Benutzer 2 verschiedene Widgets in einem QGroupBox berührt und beide Widgets das QEvent::TouchBegin Ereignis ignorieren.
Um dies zu vermeiden, gruppiert Qt neue Berührungspunkte nach den folgenden Regeln:
- Wenn der erste Berührungspunkt erkannt wird, wird das Ziel-Widget erstens durch die Position auf dem Bildschirm und zweitens durch die Ausbreitungsregeln bestimmt.
- Wenn weitere Berührungspunkte erkannt werden, prüft Qt zunächst, ob es aktive Berührungspunkte auf einem Vorfahren oder Nachfahren des Widgets unter dem neuen Berührungspunkt gibt. Wenn dies der Fall ist, wird der neue Berührungspunkt mit dem ersten gruppiert und der neue Berührungspunkt wird in einem einzigen QTouchEvent an das Widget gesendet, das den ersten Berührungspunkt bearbeitet hat. (Das Widget unter dem neuen Berührungspunkt wird kein Ereignis erhalten).
Dies ermöglicht es Geschwister-Widgets, Berührungsereignisse unabhängig voneinander zu behandeln und stellt sicher, dass die Reihenfolge der QTouchEvents immer korrekt ist.
Mausereignisse und Synthese von Berührungsereignissen
Die Zustellung von QTouchEvents ist unabhängig von der von QMouseEvent. Die Anwendungsflags Qt::AA_SynthesizeTouchForUnhandledMouseEvents und Qt::AA_SynthesizeMouseForUnhandledTouchEvents können verwendet werden, um die automatische Synthese von Berührungsereignissen zu Mausereignissen und Mausereignissen zu Berührungsereignissen zu aktivieren oder zu deaktivieren.
Vorbehalte
- Wie oben erwähnt, bedeutet die Aktivierung von Berührungsereignissen, dass mehrere Widgets gleichzeitig Berührungsereignisse empfangen können. In Kombination mit der standardmäßigen QWidget::event()-Behandlung von QTouchEvents bietet dies eine große Flexibilität bei der Gestaltung von Touch-Benutzeroberflächen. Seien Sie sich der Auswirkungen bewusst. Es ist zum Beispiel möglich, dass der Benutzer ein QSlider mit einem Finger bewegt und ein QPushButton mit einem anderen drückt. Die von diesen Widgets ausgesendeten Signale werden sich überschneiden.
- Eine Rekursion in die Ereignisschleife mit einer der exec()-Methoden (z. B. QDialog::exec() oder QMenu::exec()) in einem QTouchEvent-Event-Handler wird nicht unterstützt. Da es mehrere Ereignisempfänger gibt, kann die Rekursion Probleme verursachen, einschließlich, aber nicht beschränkt auf verlorene Ereignisse und unerwartete unendliche Rekursion.
- QTouchEvents werden nicht von mouse grab oder active pop-up widget beeinflusst. Das Verhalten von QTouchEvents ist undefiniert, wenn ein Pop-up geöffnet oder die Maus angefasst wird, während mehr als ein aktiver Berührungspunkt vorhanden ist.
Siehe auch QEventPoint, QEventPoint::State, Qt::WA_AcceptTouchEvents, und QGraphicsItem::acceptTouchEvents().
Dokumentation der Mitgliedsfunktionen
[explicit]
QTouchEvent::QTouchEvent(QEvent::Type eventType, const QPointingDevice *device = nullptr, Qt::KeyboardModifiers modifiers = Qt::NoModifier, const QList<QEventPoint> &touchPoints = {})
Konstruiert ein QTouchEvent mit den angegebenen eventType, device, touchPoints und der aktuellen Tastatur modifiers zum Zeitpunkt des Ereignisses.
[override virtual]
bool QTouchEvent::isBeginEvent() const
Gibt true zurück, wenn dieses Ereignis mindestens einen neu gedrückten Touchpoint enthält.
[override virtual]
bool QTouchEvent::isEndEvent() const
Gibt true zurück, wenn dieses Ereignis mindestens einen neu freigegebenen Touchpoint enthält.
[override virtual]
bool QTouchEvent::isUpdateEvent() const
Gibt true zurück, wenn dieses Ereignis keine neu gedrückten oder neu losgelassenen Touchpoints enthält.
QObject *QTouchEvent::target() const
Gibt das Zielobjekt innerhalb des Fensters zurück, in dem das Ereignis aufgetreten ist. Dies ist normalerweise QWidget oder QQuickItem. Kann 0 sein, wenn kein spezifisches Ziel verfügbar ist.
QEventPoint::States QTouchEvent::touchPointStates() const
Gibt ein bitweises ODER aller Berührungspunktzustände für dieses Ereignis zurück.
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.