Qt 如何处理子菜单的onClick或onTriggered事件?
我有一个对象的层次结构,我想通过菜单选择对象。菜单表示子菜单的相应层次结构。但若对象有子对象,那个么相应的菜单项就不能捕捉鼠标单击事件。见下面的代码:Qt 如何处理子菜单的onClick或onTriggered事件?,qt,qml,qt5,qtquick2,qtquickcontrols2,Qt,Qml,Qt5,Qtquick2,Qtquickcontrols2,我有一个对象的层次结构,我想通过菜单选择对象。菜单表示子菜单的相应层次结构。但若对象有子对象,那个么相应的菜单项就不能捕捉鼠标单击事件。见下面的代码: import QtQuick 2.13 import QtQuick.Window 2.13 import QtQuick.Controls 2.13 Window { visible: true width: 640 height: 480 Menu { id: contextMenu
import QtQuick 2.13
import QtQuick.Window 2.13
import QtQuick.Controls 2.13
Window {
visible: true
width: 640
height: 480
Menu {
id: contextMenu
MenuItem {
text: "Object1"
onTriggered: console.log(text + " selected")
}
Menu {
title: "Object2"
onTriggered: console.log(title + " selected") // Error!!! Non-existent property "onTriggered"!
MenuItem {
text: "SubObject1"
onTriggered: console.log(text + " selected")
}
MenuItem {
text: "SubObject2"
onTriggered: console.log(text + " selected")
}
}
MenuItem {
text: "Object3"
onTriggered: console.log(text + " selected")
}
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.RightButton
onClicked: {
if (mouse.button === Qt.RightButton)
contextMenu.popup()
}
}
}
类菜单没有触发的或单击的信号。另一种变体是将MenuItem添加到其他MenuItem:
MenuItem {
text: "Object2"
onTriggered: console.log(text + " selected")
MenuItem {
text: "SubObject1"
onTriggered: console.log(text + " selected")
}
MenuItem {
text: "SubObject2"
onTriggered: console.log(text + " selected")
}
}
在这种情况下,程序运行,但菜单看起来很奇怪:它没有子菜单,所有菜单项位于同一位置:
可以在包含子菜单的菜单项上处理鼠标单击吗?菜单没有文本属性。让我们尝试将日志消息更改为使用title属性。这可能会损坏所有子组件
更新;
这个信号存在吗?目的是什么。菜单是上面屏幕截图上填充项目的矩形,即我们只能触发/单击项目。这对我来说没有意义-你应该通过菜单项处理子菜单项的鼠标单击,你已经在这样做了。有什么问题吗?“如果我将MenuItem添加到其他MenuItem中,QML将无法正确显示它们。”我无法用您的示例重现此内容。我已更改了问题的措辞。问题是:如果您将鼠标悬停在菜单项上,子菜单将打开,而如果您单击包含子菜单的菜单项,则不会发生任何事情。所以我想处理鼠标点击并用它来选择相应的对象。@AndreyEpifantsev为什么要得到一个有菜单项的菜单的点击/触发?我这样问是因为设计时,开发人员感兴趣的是单击菜单项而不是菜单项。例如,在您的例子中,我对单击子对象1感兴趣,但对Object2不感兴趣。因为我有Object2,我希望用户能够选择它。对象是表单层次结构。例如,在QML中,可以将一个矩形放在另一个矩形内。第一个矩形成为第二个矩形的子矩形。但它们仍然是单独的对象,在QML vusual编辑器中,您可以单独选择它们。您的原始示例对我来说很好。我建议发布一个完整的示例来演示这个问题。完整的错误消息:qrc:/main.qml:18无法分配给不存在的属性“onTriggered”