MouseArea-QML元素';s鼠标事件
如果在QML元素上放置MouseArea-QML元素';s鼠标事件,qml,mouseevent,mousearea,Qml,Mouseevent,Mousearea,如果在QML元素上放置MouseArea,则MouseArea将窃取所有鼠标事件。 因此,TextEdit将不可编辑且不可选择 TextEdit { // some properties MouseArea { // some properties onClicked: { /* do something */ } } } 有办法解决吗 顺便说一下,如果我把一个大的MouseArea放在另一个MouseArea上,较大的MouseArea
MouseArea
,则MouseArea
将窃取所有鼠标事件。
因此,TextEdit
将不可编辑且不可选择
TextEdit {
// some properties
MouseArea {
// some properties
onClicked: { /* do something */ }
}
}
有办法解决吗
顺便说一下,如果我把一个大的
MouseArea
放在另一个MouseArea
上,较大的MouseArea
将窃取所有鼠标事件。我怎么解决它?我认为手动传递鼠标事件可以解决这一问题,但如何做到这一点?您可以针对您的特定情况尝试以下方法:
Rectangle
{
MouseArea
{
id: mouseAreaTop
anchors.fill: parent
OnClicked: { /* do something */ }
}
TextEdit
{
/* Do whatever */
}
}
请注意,我已按顺序排列了这些。所有子项的z值都将高于父项。对于父级,在树中后面出现的同级具有更高的z值
总体思路如下:
在本例中,我通过自己分配z值来覆盖自然顺序。有一个属性
propagateComposedEvents
,它允许MouseArea
通过鼠标事件,例如clicked()
。
您必须在事件处理程序中设置event.accepted=false
有关更多信息和示例,请参阅
MouseArea
的文档和属性propagateComposedEvents
。您必须启用MouseArea
将组合事件(如单击的或释放的
)传播到下面的组件,如@Torgeirl的回答所述
如果希望您的文本编辑
、滑块
或复选框
接收此类事件,只需将其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;
}
}
我使用Qt4。我不能用它。那不是我想要的。在第一个示例中,mouseEvent不会发出,因为TextEdit
高于mouseArea
。我想要text编辑
accept mouseEvent并同时选择。我想找到一种方法来模拟Qt4中Qt5的propagateComposedEvents
功能。当我遇到这个问题时,我正在寻找其他解决方案,我想我应该指出,对于某些信号处理程序,设置mouse.accepted=false
没有效果(搜索MouseArea
docs以查找对查找所有文件没有任何作用。
如果我想持续更新mouseX和mouseY,此解决方案不起作用。更改上面示例代码中的文本编辑以显示鼠标X、Y位置,只要按住鼠标按钮,您就会看到它停止更新。设置onPressed中的“mouse.accepted=false”会导致MouseArea属性在释放按钮之前不会更新。不确定这是否是一个错误?这一问题由BaCaRoZzo和szotsaki方法解决,非常感谢
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;
}
}
//消息框
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
}
}
}
}