原文: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屬性會被忽略不做處理。