QML中MouseArea元素的介紹


原文:http://www.thisisqt.com/?action-viewnews-itemid-22

MouseArea元素的一個很典型的用法是和一個可視的item一起用,處理這個item的鼠標響應。
在下例中我們將MouseArea放到Rectangle中,當單擊Rectangle區域中時,Rectangle顏色會變成紅色。
import Qt 4.7

 Rectangle {
     width: 100; height: 100
     color: "green"

     MouseArea {
         anchors.fill: parent
         onClicked: { parent.color = 'red' }
     }
 }
很多時候,MouseArea區域會傳遞一個鼠標事件作為參數,這個參數中包含了很多鼠標事件信息,例如,
單擊的位置,具體按下的一個鼠標左鍵還是右鍵,以及一些鍵盤按鍵信息。在下面的例子中,當Rectangle
區域被右鍵單擊時會觸發改變顏色。
Rectangle {
     width: 100; height: 100
     color: "green"

     MouseArea {
         anchors.fill: parent
         acceptedButtons: Qt.LeftButton | Qt.RightButton
         onClicked: {
             if (mouse.button == Qt.RightButton)
                 parent.color = 'blue';
             else
                 parent.color = 'red';
         }
     }
 }
對於其他鍵盤按鍵的處理,請參考Keys元素的介紹。
MouseArea是一個可見的item,但它本身並不顯示什么。

屬性
acceptedButtons : Qt::MouseButtons
表示MouseArea響應的鼠標按鍵。可取的值有以下三個:
Qt.LeftButton
Qt.RightButton
Qt.MiddleButton
默認值是Qt.LeftButton。acceptButtons屬性還可以接受以上三個值的或組合形式,如下例所示:
MouseArea { acceptedButtons: Qt.LeftButton | Qt.RightButton }

containsMouse : bool 只讀
containsMouse屬性用來表明當前的鼠標是否在MouseArea中。
注意如果當前鼠標時MouseArea中,此時如果移動MouseArea,這個屬性不會自動更新,也就是說
containsMouse屬性值不會改變。另外如果hoverEnabled為假,只有當鼠標被單擊時containsMouse
才是正確的。

drag.target : Item
read-onlydrag.active : bool
drag.axis : enumeration
drag.minimumX : real
drag.maximumX : real
drag.minimumY : real
drag.maximumY : real
drag.filterChildren : bool
drag屬性集讓item拖動變得很方便。其中drag.target用來指明可以拖動的目標item的id,
drag.active表明目標item當前是否正在被拖動。drag.axis用來說明是否可以水平拖動(Drag.XAxis)
或是垂直拖動(Drag.XAxis)或是兩者(Drag.XandYAxis)都允許。drag.minimum和drag.maximum用來
指明可以拖動的最小和最大距離。下面的例子中,Rectangle可以沿着x軸拖動。當拖動到右邊的時候
Rectangle的透明度會降低。
Rectangle {
     id: container
     width: 600; height: 200

     Rectangle {
         id: rect
         width: 50; height: 50
         color: "red"
         opacity: (600.0 - rect.x) / 600

         MouseArea {
             anchors.fill: parent
             drag.target: rect
             drag.axis: Drag.XAxis
             drag.minimumX: 0
             drag.maximumX: container.width - rect.width
         }
     }
 }

enabled : bool
enabled屬性表示item是否接受鼠標事件。默認為真,即接受鼠標事件。

hoverEnabled : bool
hoverEnabled屬性表明是否處理鼠標懸停事件。
默認情況下,只處理鼠標的按鍵事件。如果hoverEnabled屬性為真則所有的鼠標事件都會被處理,
即使鼠標沒有被按下。這個屬性影響containMouse屬性,onEntered,onExited以及onPositionChanged信號。

mouseX : real 只讀屬性
mouseY : real 只讀屬性
mouseX和mouseY屬性是當前鼠標的位置。如果hoverEnabled屬性為假則只有當鼠標按下時,mouseX和mouseY屬性
才有效。如果hoverEnabled屬性為真,則mouseX和mouseY只在下面兩種情況下才有效:
1.    沒有鼠標按下,但鼠標在MouseArea(containsMouse為真)。
2.    鼠標按下並按住,即使鼠標已經移動到MouseArea之外。
mouseX和mouseY是相對於MouseArea的坐標。

pressed : bool 只讀
pressed屬性表明當前MouseArea是否按下。

pressedButtons : MouseButtons 只讀
顧名思義,pressedButtons表示當前按下的鼠標是哪個鍵,具體取值如下:
Qt.LeftButton
Qt.RightButton
Qt.MiddleButton
下面的例子中,當單擊鼠標右鍵時會顯示字符“right”。
Text {
     text: mouseArea.pressedButtons & Qt.RightButton ? "right" : ""
     horizontalAlignment: Text.AlignHCenter
     verticalAlignment: Text.AlignVCenter

     MouseArea {
         id: mouseArea
         anchors.fill: parent
         acceptedButtons: Qt.LeftButton | Qt.RightButton
     }
 }

信號
MouseArea::onCanceled ()
當鼠標事件沒有被接受或是被其他元素截獲時,MouseArea::onCanceled()會被調用。當有多個MouseArea處理輸入時
或是Flickable元素中包含一個MouseArea時,MouseArea::onCanceled()會顯得特別重要。如果在Flickable元素中包
含一個MouseArea時,當執行一些針對於按下信號的邏輯處理然后又拖動鼠標時,Flickable會從MouseArea中截獲鼠標
事件。在這種情況下,當Flickable截獲了MouseArea的鼠標事件時需要重置邏輯。

MouseArea::onClicked ( MouseEvent mouse )
當有單擊事件(在MouseArea中按下緊接着彈起)發生時,MouseArea::onClicked方法會被調用。

MouseArea::onDoubleClicked ( MouseEvent mouse )
當有雙擊事件(按下緊接着彈起然后再按下)發生時調用。在MouseArea::onDoubleClicked中如果將accepted屬性設置
為假,則在第二次單擊時onPressed、onReleased、onClicked仍會被調用,否則在第二次單擊時onPressed、onReleased、
onClicked不會被調用。

MouseArea::onEntered ()
當鼠標進入MouseArea中時,MouseArea::onEntered()會被調用。默認情況下,只有當鼠標在MouseArea中單擊時才會調用,
可如果將hoverEnabled設置為真,當鼠標拖動至MouseArea時也會調用onEntered();

MouseArea::onExited ()
當鼠標離開MouseArea中時,MouseArea:: onExited ()會被調用。默認情況下,只有當鼠標在MouseArea中單擊時才會調用,
可如果將hoverEnabled設置為真,當鼠標拖動至MouseArea時也會調用onExited ();

MouseArea::onPositionChanged ( MouseEvent mouse )
當鼠標位置發生改變時會調用onPositionChanged,在這個方法中不會考慮MouseEvent參數的accepted屬性,也就是說所有的
鼠標事件在這里都會被處理,並不會因為某個鼠標事件被拒絕了而不做處理。默認情況下,只有在鼠標按下時才會調用onPositionChanged。
不過如果將hoverEnabled設置為真,當鼠標移動時onPositionChanged也會被調用。

MouseArea::onPressed ( MouseEvent mouse )
當有鼠標按下時onPressed會被調用。MouseEvent類型的參數提供有關按下時的鼠標信息,包括鼠標的位置以及按下時對應的鼠標按鍵。
參數mouse的accepted屬性決定了MouseArea是否要處理這個鼠標事件。如果mouse的accept屬性被設置為假則直到下一個按下事件發生,
這這間任何鼠標事件都不會發送給MouseArea。

MouseArea::onReleased ( MouseEvent mouse )
當有鼠標彈起時會調用onReleased。MouseEvent類型的參數提供有關按下時的鼠標信息,包括鼠標的位置以及按下時對應的鼠標按鍵。

參數mouse的accepted屬性會被忽略不做處理。


免責聲明!

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



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