首页 > 解决方案 > 如何处理子菜单的 onClick 或 onTriggered 事件?

问题描述

我有一个对象层次结构,我想通过菜单选择对象。Menu 表示相应的子菜单层次结构。但是如果对象有子对象,则相应的菜单项无法捕获鼠标单击事件。请参见下面的代码:

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()
        }
    }
}

Class Menu 没有triggered或没有clicked信号。另一种变体是将 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")
            }
        }

在这种情况下,程序运行但菜单看起来很奇怪:它没有子菜单,并且所有 sumenu 项目都位于同一个位置:

在此处输入图像描述

是否可以处理鼠标单击包含子菜单的菜单项?

标签: qtqmlqt5qtquick2qtquickcontrols2

解决方案


菜单没有文本属性。让我们尝试将日志消息更改为使用 title 属性。这可能会破坏所有子组件。

更新; 存在这个信号吗?目的是什么。菜单是上面屏幕截图中填充项目的矩形,即我们只能触发/单击项目。


推荐阅读