Demo測試
代碼
ApplicationWindow {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
MouseArea{
anchors.fill: parent
onPressed: {
console.log("pressed , pressed , pressed !")
}
onReleased: {
console.log("released , released , released !")
}
onClicked: {
console.log("clicked , clicked , clicked !")
}
onDoubleClicked: {
console.log("doubleClicked , doubleClicked , doubleClicked !")
}
}
}
運行結果
鼠標按下時
鼠標釋放時
鼠標單擊時
鼠標雙擊時
分析
單擊
1、click = press + release
2、click = release
單擊時,當鼠標按下並不會觸發單擊事件,鼠標釋放時纔會觸發,所以MouseArea的onClicked()槽函數等同於onReleased()
雙擊
1、doubleClick = press + release + press
2、doubleClick = click + press
雙擊時一定會觸發一次單擊信號,所以只需要觸發雙擊事件的話必須要過濾掉單擊事件
3、doubleClick ≠ click + click
onDoubleClicked()會在鼠標第二次按下時執行,並且並不存在第二次單擊事件
雙擊時過濾單擊信號
代碼
property int clickNum: 0
Timer{
id: clickTimer
//超過300ms還沒有觸發第二次點擊證明時單擊(並不一定非要用300ms延時,不過300ms是經典延時時間)
interval: 300;
onTriggered: {
clickNum = 0
clickTimer.stop()
console.log("clicked, clicked, clicked")
}
}
Rectangle{
anchors.fill: parent
MouseArea{
anchors.fill: parent
onClicked: {
clickNum ++
if(clickNum == 1)
{
clickTimer.start()
}
if(clickNum == 2)
{
clickNum = 0
clickTimer.stop()
console.log("doubleClicked, doubleClicked,doubleClicked")
}
}
}
}