如果我在QML元素上放置MouseArea
,那么MouseArea
将窃取所有鼠标事件。
因此,TextEdit
将是不可编辑且无法选择的。
TextEdit {
// some properties
MouseArea {
// some properties
OnClicked: { /* do something */ }
}
}
有没有办法解决它?
顺便说一下,如果我将MouseArea
放在另一个MouseArea
上,则较大的MouseArea
会窃取所有鼠标事件。我该如何解决?我认为手动传递鼠标事件可以解决这个问题,但是怎么做呢?
答案 0 :(得分:20)
您必须启用MouseArea
将组合事件(如clicked
或released
)传播到下方组件,如@ Torgeirl的回答所述。
如果您希望TextEdit
,Slider
或CheckBox
收到此类事件,只需将accepted
属性设置为{{1}即可通过该事件。 }。
示例代码:
false
答案 1 :(得分:5)
有propagateComposedEvents
属性允许MouseArea
通过clicked()
之类的鼠标事件。
您必须在事件处理程序中设置event.accepted = false
。
请参阅MouseArea
的文档和属性propagateComposedEvents
以获取更多信息和示例。
答案 2 :(得分:0)
你可以针对你的具体情况尝试这样的事情:
Rectangle
{
MouseArea
{
id: mouseAreaTop
anchors.fill: parent
OnClicked: { /* do something */ }
}
TextEdit
{
/* Do whatever */
}
}
请注意,我已将这些内容安排在订单中。所有孩子的z都比父母高。后来在树中为父母出现的兄弟姐妹具有更高的z值。
一般的想法是这样的:
了解z属性here in the Qt documentation,您将能够了解如何安排鼠标区域。
例如:
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值来覆盖自然排序。
答案 3 :(得分:-2)
//消息框
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
}
}
}
}