QTouchEvent 類

QTouchEvent 類包含觸摸事件的描述參數。 更多...

頭: #include <QTouchEvent>
qmake: QT += gui
Since: Qt 4.6
繼承: QInputEvent

該類在 Qt 4.6 引入。

公共類型

class TouchPoint

公共函數

QTouchEvent (QEvent::Type eventType , QTouchDevice * device = nullptr, Qt::KeyboardModifiers modifiers = Qt::NoModifier, Qt::TouchPointStates touchPointStates = Qt::TouchPointStates(), const QList<QTouchEvent::TouchPoint> & touchPoints = QList<QTouchEvent::TouchPoint>())
virtual ~QTouchEvent ()
QTouchDevice * device () const
QObject * target () const
Qt::TouchPointStates touchPointStates () const
const QList<QTouchEvent::TouchPoint> & touchPoints () const
QWindow * window () const

詳細描述

啓用觸摸事件

觸摸事件發生,當在觸摸設備 (譬如:觸摸屏或跟蹤闆) 中按下、釋放或移動一個或多個觸摸點時。要接收觸摸事件,Widget 必須擁有 Qt::WA_AcceptTouchEvents 屬性設置和圖形項需要擁有 acceptTouchEvents 屬性設置為 true。

當使用 QAbstractScrollArea 基 Widget,應啓用 Qt::WA_AcceptTouchEvents 屬性在捲動區域 viewport .

類似於 QMouseEvent ,Qt 自動抓取每個觸摸點當在 Widget 內第一次按下時,且小部件將接收觸摸點的所有更新,直到它被釋放。注意,Widget 能接收很多觸摸點事件,且多個小部件可能同時接收觸摸事件。

事件處理

所有觸摸事件類型,包括 QEvent::TouchBegin , QEvent::TouchUpdate , QEvent::TouchEnd or QEvent::TouchCancel 。重實現 QWidget::event () 或 QAbstractScrollArea::viewportEvent () 對於 Widget 和 QGraphicsItem::sceneEvent () 對於要接收觸摸事件的圖形視圖項。

不像 Widget,QWindows 始終接收觸摸事件,無需選項。當直接工作於 QWindow ,是足夠的重實現 QWindow::touchEvent ().

The QEvent::TouchUpdate and QEvent::TouchEnd 事件會被發送給 Widget 或項接受 QEvent::TouchBegin 事件。若 QEvent::TouchBegin 事件未接受且未被事件過濾器所過濾,則進一步觸摸事件不會被發送直到下一 QEvent::TouchBegin .

某些係統可能發送事件類型 QEvent::TouchCancel 。當收到此事件時,應用程序被請求忽略整個活動觸摸序列。例如,在閤成係統中,閤成器可以決定將某些手勢視為係統範圍手勢。每當做齣這種決定 (識彆手勢) 時,會通知客戶端采用 QEvent::TouchCancel 事件,因此它們可以相應更新其狀態。

The touchPoints () 函數返迴事件中包含的所有觸摸點的列錶。注意,此列錶可能為空,例如,若為 QEvent::TouchCancel 事件。可以檢索每個觸摸點的有關信息使用 QTouchEvent::TouchPoint 類。 Qt::TouchPointState 枚舉描述觸摸點可能擁有的不同狀態。

注意: 列錶 touchPoints () 從不會是一部分:觸摸事件將始終包含目標窗口 (或 Widget) 到發送事件的每一現有物理觸摸聯絡的觸摸點。例如,假定所有觸摸都目標同一窗口 (或 Widget),則事件具有條件 touchPoints ().count()==2 保證,暗示觸摸觸摸屏 (或觸摸闆) 的準確手指數為 2。

事件的交付和傳播

默認情況下, QGuiApplication 翻譯第一觸摸點在 QTouchEvent 成 QMouseEvent . This makes it possible to enable touch events on existing widgets that do not normally handle QTouchEvent. See below for information on some special considerations needed when doing this.

QEvent::TouchBegin 是發送給 Widget 的第一觸摸事件。 QEvent::TouchBegin 事件包含指示接收者是否想要事件的特殊接受標誌。默認情況下,接受事件。應該調用 ignore () 若 Widget 不處理觸摸事件。 QEvent::TouchBegin 事件會沿父級 Widget 鏈嚮上傳播,直到小部件接受它采用 accept (),或事件過濾器消耗掉它。對於 QGraphicsItems, QEvent::TouchBegin 事件被傳播給鼠標下項 (類似於 QGraphicsItems 的鼠標事件傳播)。

觸摸點分組

如上所述,它是可能的幾個 Widget 可以同時接收 QTouchEvents。不管怎樣,Qt 確保從不重復發送 QEvent::TouchBegin 事件給同一 Widget,理論上傳播期間可能發生,例如,若用戶觸摸 2 單獨 Widget 在 QGroupBox 與兩 Widget 忽略 QEvent::TouchBegin 事件。

為避免這,Qt 使用下列規則將新觸摸點分組到一起:

  • 當檢測到第一觸摸點時,目的地 Widget 首先由屏幕位置確定,其次由傳播規則確定。
  • When additional touch points are detected, Qt first looks to see if there are any active touch points on any ancestor or descendent of the widget under the new touch point. If there are, the new touch point is grouped with the first, and the new touch point will be sent in a single QTouchEvent to the widget that handled the first touch point. (The widget under the new touch point will not receive an event).

這使同級 Widget 能夠獨立處理觸摸事件,同時確保 QTouchEvents 序列始終正確成為可能。

鼠標事件和觸摸事件閤成

QTouchEvent 的交付獨立於 QMouseEvent 。應用程序標誌 Qt::AA_SynthesizeTouchForUnhandledMouseEvents and Qt::AA_SynthesizeMouseForUnhandledTouchEvents 可以用於啓用 (或禁用) 將觸摸事件自動閤成為鼠標事件,和將鼠標事件自動閤成為觸摸事件。

告誡

  • 如上所述,啓用觸摸事件意味著多個 Widget 可以同時接收觸摸事件。組閤默認 QWidget::event () 處理 QTouchEvents,這為設計觸摸用戶界麵賦予瞭很大靈活性。要意識到其中所隱含的。例如,用戶可能正移動 QSlider 用一根手指並按下 QPushButton 用另一根手指。由這些 Widget 發射的信號將交錯。
  • 遞歸到事件循環使用某一 exec() 方法 (如 QDialog::exec () 或 QMenu::exec ()) in a QTouchEvent event handler is not supported. Since there are multiple event recipients, recursion may cause problems, including but not limited to lost events and unexpected infinite recursion.
  • QTouchEvents 不受影響被 鼠標抓取 活動彈齣 Widget 。QTouchEvents 的行為未定義,當打開彈齣窗口 (或抓取鼠標) 且存在多個活動觸摸點時。

另請參閱 QTouchEvent::TouchPoint , Qt::TouchPointState , Qt::WA_AcceptTouchEvents ,和 QGraphicsItem::acceptTouchEvents ().

成員函數文檔編製

QTouchEvent:: QTouchEvent ( QEvent::Type eventType , QTouchDevice * device = nullptr, Qt::KeyboardModifiers modifiers = Qt::NoModifier, Qt::TouchPointStates touchPointStates = Qt::TouchPointStates(), const QList < QTouchEvent::TouchPoint > & touchPoints = QList<QTouchEvent::TouchPoint>())

構造 QTouchEvent 采用給定 eventType , device ,和 touchPoints touchPointStates and modifiers 是事件發生時當前觸摸點狀態和鍵盤修飾符。

[虛擬] QTouchEvent:: ~QTouchEvent ()

銷毀 QTouchEvent .

QTouchDevice *QTouchEvent:: device () const

返迴此觸摸事件發源的觸摸設備。

QObject *QTouchEvent:: target () const

返迴齣現事件的窗口內的目標對象。這通常是 QWidget QQuickItem 。可能為 0 當沒有可用特定目標時。

Qt::TouchPointStates QTouchEvent:: touchPointStates () const

返迴此事件所有觸摸點狀態的按位 OR。

const QList < QTouchEvent::TouchPoint > &QTouchEvent:: touchPoints () const

返迴觸摸事件中包含的觸摸點列錶。

QWindow *QTouchEvent:: window () const

返迴齣現事件的窗口。當基於像 rawScreenPositions() 數據做全局-本地映射時會很有用,齣於性能原因,僅將全局位置存儲在觸摸事件中。