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動態加載組件

作用:對於拖延組件的創建是很用的。當一個組件需要在要求的時候被創建,或者當由於性能原因一個組件不應該被創建是。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM