QML事件处理 八
1、MouseArea
MouseArea 是一個不可見的項目,通常用來和一個可見的項目配合使用來為其提供鼠標處理。鼠標處理的邏輯可以包含在一個MouseArea項目中。
MouseArea的enabled屬性可以用來設置是否啟用鼠標處理,值默認為true;
只讀屬性pressed表明了是否用戶在MouseArea按住了鼠標按鈕,這個屬性經常用于屬性綁定,可以實現在鼠標按下時執行一些操作。
只讀的containsMouse屬性表明了當前是否由鼠標光標在MouseArea上,默認的,只有鼠標的一個按鈕處于按下狀態才可以被檢測到。
對于鼠標的位置好按鈕單擊等信息是用過信號提供的,可以使用事件處理器來獲取,最常用的有onClicked(),onDoubleClicked(),onPressed()
onReleased()和onPressAndHold()等。
默認情況下,MouseArea項目只報告鼠標單擊而不報告鼠標光標的位置改變,這個可以通過設置hoverEnabled屬性來進行更改。這樣onPositionChanged()、onEntered()和onExited()等處理函數都可以使用了。而且這時containsMouse屬性也可以在沒有鼠標按鈕按下的情況下進行檢查了。
| 1 2 3 4 5 6 7 8 9 10 11 12 | Rectangle{ ????color:"blue" ????border.color:?"red" ????border.width:?5 ????radius:?10 ????width:100;height:100 ????MouseArea{ ????anchors.fill:parent ????onClicked: {parent.color =?"red"} ????} ????} |
方塊從藍變紅。
1.1 MouseEvent
在很多MouseArea的信號中都包含了一個鼠標事件參數,例如MouseArea::onClicked(MouseEvent mouse)。在MouseEvent對象中,可以通過x和y屬性獲取鼠標的位置;通過button屬性可以獲取按下的按鍵;通過modifiers屬性可以獲取按下的鍵盤修飾符等。
button值:Qt.LeftButton Qt.RightButton Qt.MiddleButton
modifiers值:由多個按鍵進行位組合而成,在使用是需要將modifiers與這些特殊的按鍵進行按位與來判斷按鍵,常用的按鍵由Qt.NoModifier沒有修飾鍵、Qt.ShiftModifier Qt.ContralModifier Qt.AltModifier.例子如下
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | MouseArea{ // mouse 作為clicked()信號傳進來的參數,在onClicked中使用 ?anchors.fill:parent ?acceptedButtons: Qt.LeftButton|Qt.RightButton ?onClicked: { ?????if(mouse.button == Qt.LeftButton) ????????{parent.color =??"blue"; ?????????console.debug("左鍵");} ?????else if((mouse.button == Qt.RightButton) ?????????????&&(mouse.modifiers & Qt.ShiftModifier)) ????????{ parent.color =?"green"; ??????????console.debug("右鍵");} ?????else ?????{parent.color =?"red"; ??????console.debug(mouse.button);} ?} ?} |
實現的功能是,當按下鼠標右鍵時,Rectangle變色。
?
1.2 拖拽功能
MouseArea中的drag分組屬性提供了一個使項目可以拖拽的簡便方法。
drag.target屬性用來指定拖動的項目id;
drag.active屬性獲取項目當前是否正在被拖動的信息;
drag.axis屬性用來指定屬性的拖動方向(水平方向:Drag.XAxis 和 Drag.YAxis 或者 Drag.XandYAxis);
drag.minimum和drag.maximum限制了項目在指定方向上拖動的距離。
舉例如下:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Rectangle{ ?????id:container ?color:"blue" ?width:400;height:200 Rectangle{ id:rect width:50;?height:20; color:"red" opacity:(container.width-rect.x)/container.width } ?MouseArea{ ?anchors.fill:parent ?drag.target: rect ?drag.axis: Drag.XAxis ?drag.minimumX:?0 ?drag.maximumX: contains.width-rect.width ?} |
drag作為mouse事件中的一個屬性,可以指定一個目標,設定其可拖拽的功能。本例子中紅色小方塊可以進行水平拖動。并且在拖動的過程中,小方塊的透明度會發生變化。
?
2 按鍵處理(與鼠標對應)
2.1按鍵處理概述
當用戶按下或者釋放一個按鍵,會按以下步驟進行處理:
第一步,Qt獲取鍵盤動作并產生一個鍵盤事件
第二步,如果包好QDeclarativeView的Qt部件具有焦點(focus),那么鍵盤事件會傳遞給它,否則將進行常規的按鍵處理。
第三步,場景將鍵盤事件交給具有活動焦點的QML項目。如果沒有項目具體活動焦點,鍵盤事件會被忽略,然后繼續常規的按鍵處理。
第四步,如果具有活動焦點的QML項目接接受了該鍵盤事件,那么傳播將停止。否則,改時間會遞歸的傳遞到每一個項目的副項目,直到被接受,或者到達根項目。
第五步,如果到達了根項目,該鍵盤事件會被忽略而繼續常規的Qt按鍵處理。
所有的基于Item的可見元素都可以通過keys附加屬性來進行按鍵處理。Keys附加屬性提供了基本的處理器,例如onPressed和onReleased,也提供了對特殊按鍵的處理器。例如onCancelPressed。例如下面的代碼:
| 1 2 3 4 5 6 7 8 9 10 11 | Rectangle{ ????width:?100;?height:100 ????focus:true ????Keys.onPressed: { ????if(event.key == Qt.Key_A) ????{ ????????console.log("key A was pressed"); ????????event.accepted = true; ????} ????} } |
使用Keys附加屬性進行處理。event.accepted設置為true可以防止事件想上層項目傳播。
?
活動焦點focus:當一個按鍵按下或者釋放時,則產生一個鍵盤事件,并將其傳遞給獲得由焦點的QML項目。
? ? ? ? ? ? ? ? ? ? ?如果一個項目的focus屬性為true,那么這個項目便會獲得焦點。所以使用鍵盤事件前,先將focuss設置好。
?
2.2查詢活動焦點項目
Item::activeFocus屬性可以查詢一個項目是否具有活動焦點。例如
Text{text:activeFocus?"I have active focus":"I dont have active focus"}
?
2.3 獲取焦點和焦點作用域
正常一個Item項目可以設置focus屬性獲得焦點。但是當其作為組件時(例如上述例子Key_A),簡單的使用focus屬性就不再有效。因為組件中的也存在focus為true的情況,所以引入焦點作用域FocusScope來解決該問題。在組件中使用FocusScope元素。
?
3.定時器
| 1 2 3 4 5 6 7 8 9 | Timer{ ????interval:500; running:true; ????repeat:true ????onTriggered: time.text = Date().toString() } Text{ ????id:time} } |
定時器可以用來將一個動作在指定的事件間隔觸發一次或者多次,在QML中使用Timer元素來表示一個定時器。例子中表示每隔500ms更新一次文本的顯示。
interval屬性:設置時間間隔,單位ms,默認1000ms
repeat屬性:社則是否重復觸發。如果是false則只觸發一次并自動將running屬性設置為false.默認值為false。
running屬性:true開啟定時器。默認false。
當定時器觸發時會執行onTriggered()信號處理函數,在這里可以定義一些操作;
Timer提供了一些函數,比如restart(),start()和stop()等。
?
4使用Loader動態加載組件
作用:對于拖延組件的創建是很用的。當一個組件需要在要求的時候被創建,或者當由于性能原因一個組件不應該被創建是。
總結
- 上一篇: 关于Postfix邮件网关无法重启问题
- 下一篇: SQL Server 审核(Audit)