《Qt MOOC系列教程》第三章第六節:輸入處理器
技術標籤:Qt MOOC系列教程qtc++gui軟體開發程式設計
Qt Quick有多種型別可以處理觸控事件,例如我們在上一節中使用的MouseArea
,另外還有PinchArea
、MultiPointTouchArea
和Flickable
。
上面這些項都存在一些問題。比如MouseArea
,Qt只是假設有一個滑鼠,對於QMouseEvent
和QTouchEvent
在Qt Quick中都被認為是的相同事件。這就導致您不能同時與兩個MouseArea
或Flickable
進行互動。對於我們之前使用的MouseArea
就意味著您不能同時按下兩個按鈕或同時拖動兩個滑塊。也意味著您不能同時使用PinchArea
MouseArea
,因為當PinchArea
處於活動狀態時,它不會將事件傳遞給MouseArea
。
為了解決這些問題,Qt引入了新的輸入處理器型別。輸入處理器可以在任何Item
型別裡宣告,並且可以代表父物件處理來自任何指標裝置的事件。它們是非常輕量級的型別,可以被宣告為每個互動型別的處理器。每個Item
都可以有無限的處理器型別,所以你不會擔心它們不夠用。
不管是觸控事件,還是滑鼠按鈕事件或者組合鍵在活動狀態,您都可以將事件處理器對哪種互動進行響應進行約束。這是通過acceptedButtons
和acceptedDevices
屬性來實現的,可以選擇被接收的Qt::MouseButtons
或被接收的指標裝置(如PointerDevice.Mouse
PointerDevice.Stylus
或者PointerDevice.TouchScreen
)。
現在,讓我們通過示例來了解一些輸入處理器。
1. TapHandler
TapHandler
與MouseArea
有幾個關鍵的區別:
import Qt.labs.handlers 1.0 Item { TapHandler { acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus onTapped: console.log("left clicked") } TapHandler { acceptedDevices: PointerDevice.TouchScreen onTapped: console.log("tapped") } TapHandler { acceptedButtons: Qt.RightButton onTapped: console.log("right clicked") } }
現在,我們可以接收來自特定裝置的事件並做出相應的響應。也可以讓多個TapHandler
在同一個Item中活動,而不會出現多個MouseArea
之類的問題。
2. DragHandler
DragHandler
與MouseArea
的drag
屬性類似,但更易於使用。它具有類似MouseArea
中的xAxis
和yAxis
屬性組:
import Qt.labs.handlers 1.0
Rectangle {
width: 50
height: 50
color: "green"
DragHandler {
yAxis.enabled: false
}
}
在本例中,我們可以拖動Rectangle
,但只能沿著X軸方向,因為我們禁用了Y軸。
3. PointHandler
還有一個PointHandler
可用於跟蹤觸控點:
import Qt.labs.handlers 1.0
Item {
id: root
PointHandler {
id: handler
acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus
target: Rectangle {
parent: root
color: "blue"
visible: handler.active
x: handler.point.position.x - width / 2
y: handler.point.position.y - height / 2
width: 20
height: width
radius: width / 2
}
}
}
當一個press事件發生時,處理器將選擇一個尚未繫結到其他處理器的點。它將檢查給定的約束條件(acceptedDevices
等)是否滿足,是否符合該點的條件。然後它將跟蹤active
屬性為true的點,直至釋放。與其他處理器一樣,它具有target
屬性,我們在其中放置了一個矩形並綁定了處理器屬性。
獲取更多資訊,請關注作者公眾號:程式設計師練兵場