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動態加載組件
作用:對於拖延組件的創建是很用的。當一個組件需要在要求的時候被創建,或者當由於性能原因一個組件不應該被創建是。