1. 程式人生 > 其它 >《Qt MOOC系列教程》第三章第六節:輸入處理器

《Qt MOOC系列教程》第三章第六節:輸入處理器

技術標籤:Qt MOOC系列教程qtc++gui軟體開發程式設計

Qt Quick有多種型別可以處理觸控事件,例如我們在上一節中使用的MouseArea,另外還有PinchAreaMultiPointTouchAreaFlickable

上面這些項都存在一些問題。比如MouseArea,Qt只是假設有一個滑鼠,對於QMouseEventQTouchEvent在Qt Quick中都被認為是的相同事件。這就導致您不能同時與兩個MouseAreaFlickable進行互動。對於我們之前使用的MouseArea就意味著您不能同時按下兩個按鈕或同時拖動兩個滑塊。也意味著您不能同時使用PinchArea

MouseArea,因為當PinchArea處於活動狀態時,它不會將事件傳遞給MouseArea

為了解決這些問題,Qt引入了新的輸入處理器型別。輸入處理器可以在任何Item型別裡宣告,並且可以代表父物件處理來自任何指標裝置的事件。它們是非常輕量級的型別,可以被宣告為每個互動型別的處理器。每個Item都可以有無限的處理器型別,所以你不會擔心它們不夠用。

不管是觸控事件,還是滑鼠按鈕事件或者組合鍵在活動狀態,您都可以將事件處理器對哪種互動進行響應進行約束。這是通過acceptedButtonsacceptedDevices屬性來實現的,可以選擇被接收的Qt::MouseButtons或被接收的指標裝置(如PointerDevice.Mouse

, PointerDevice.Stylus或者PointerDevice.TouchScreen)。

現在,讓我們通過示例來了解一些輸入處理器。

1. TapHandler

TapHandlerMouseArea有幾個關鍵的區別:

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

DragHandlerMouseAreadrag屬性類似,但更易於使用。它具有類似MouseArea中的xAxisyAxis 屬性組

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屬性,我們在其中放置了一個矩形並綁定了處理器屬性。

Source

獲取更多資訊,請關注作者公眾號:程式設計師練兵場
在這裡插入圖片描述