如果我将MouseArea
放在QML元素上,那么MouseArea
将窃取所有鼠标事件。因此,TextEdit
将是不可编辑和不可选择的。
TextEdit {
// some properties
MouseArea {
// some properties
onClicked: { /* do something */ }
}
}
有办法解决吗?
顺便说一下,如果我把一个大的MouseArea
放在另一个MouseArea
上,大的MouseArea
将窃取所有的鼠标事件。怎么解呢?我认为传递鼠标事件手动可以解决这个问题,但如何做到这一点? 您必须启用MouseArea
来传播像clicked
或released
这样的组合事件到下面的组件,正如@Torgeirl的答案所描述的。
如果您希望TextEdit
, Slider
或CheckBox
接收这些事件,只需通过将其accepted
属性设置为false
来传递事件。
示例代码:
RowLayout {
TextEdit { text: "Hi" }
Slider {}
CheckBox { text: "CheckBox"}
MouseArea {
anchors.fill: parent
propagateComposedEvents: true
onClicked: mouse.accepted = false;
onPressed: mouse.accepted = false;
onReleased: mouse.accepted = false;
onDoubleClicked: mouse.accepted = false;
onPositionChanged: mouse.accepted = false;
onPressAndHold: mouse.accepted = false;
}
}
属性propagateComposedEvents
允许MouseArea
通过鼠标事件,如clicked()
。您必须在事件处理程序中设置event.accepted = false
。
请参阅MouseArea
和属性propagateComposedEvents
的文档以获取更多信息和示例。
您可以根据具体情况尝试如下操作:
Rectangle
{
MouseArea
{
id: mouseAreaTop
anchors.fill: parent
OnClicked: { /* do something */ }
}
TextEdit
{
/* Do whatever */
}
}
请注意,我将它们按顺序排列。所有子节点的z值都大于父节点。对于父节点,在树中较晚出现的兄弟节点具有更高的z值。
大致思路是这样的:
- 定义所有的鼠标区域
- 按z值排列
阅读Qt文档中的z属性,你将能够理解如何安排鼠标区域。
,
Parent
{
anchors.fill: parent
child1
{
anchors.fill: parent
z: 2
}
child2
{
anchors.fill: parent
z: 1
}
child3
{
anchors.fill: parent
z: 4
}
child4
{
anchors.fill: parent
z: 3
}
}
在这个例子中,我通过自己分配z值来覆盖自然排序。
//消息框
Rectangle {
id:msgRectangle
width: Math.min(messageText.implicitWidth +14, listView.width -98)
height: messageText.implicitHeight + 16
color: send ? "#9dea6a" : "#eeeeee"
radius: 3
TextEdit {
id: messageText
text: content
wrapMode: TextEdit.Wrap
enabled: true
readOnly: true
selectByKeyboard: true
selectByMouse: true
selectedTextColor: "white"
persistentSelection:true
selectionColor: "#3396FF"
}
MouseArea{
id:text_area
width: parent.width
height: parent.height
acceptedButtons: Qt.LeftButton|Qt.RightButton
propagateComposedEvents: true
onClicked: {
if(mouse.button===Qt.LeftButton){
mouse.accepted = false;
} else {
mouse.accepted = true;
}
}
onPressed: {
if(mouse.button===Qt.LeftButton){
mouse.accepted = false;
} else {
mouse.accepted = true
}
}
onReleased:{
if(mouse.button===Qt.LeftButton){
mouse.accepted = false;
} else {
mouse.accepted = true
}
}
onDoubleClicked:{
if(mouse.button===Qt.LeftButton){
mouse.accepted = false;
} else {
mouse.accepted = true
}
}
onPositionChanged:{
if(mouse.button===Qt.LeftButton){
mouse.accepted = false;
} else {
mouse.accepted = true
}
}
onPressAndHold:{
if(mouse.button===Qt.LeftButton){
mouse.accepted = false;
} else {
mouse.accepted = true
}
}
}
}