1

我想MenuItem动态创建并为其添加onTriggered回调。

var m = backContextMenu.insertItem(0,text) 

m.onTriggered = ..? //function(x) { console.log('asd') }

它给了我错误Cannot assign to read-only property "onTriggered"。我能做些什么?也许我应该使用创建我的菜单 Qt.createQmlObject('qml code...')?或者我应该以MenuItem声明方式创建模板并以某种方式克隆这个对象?

PS 我MenuItemQtQuick.ControlsQt 5.2 中使用

4

3 回答 3

2

您可以使用 Connections QML 项目使用 createQmlObject 函数创建动态连接:

var item = menuContext.insertItem(0, "menu item")
Qt.createQmlObject("import QtQuick 2.0;Connections{onTriggered:foo()}",item)

简单地说,您也可以创建直接连接:

item.onTriggered.connect(foo)

(MenuItem 必须是 Qt Quick 2 和 Qt 5.1)

于 2013-09-28T11:55:04.257 回答
0

我很幸运找到了另一种动态添加菜单项的方法:通过 Instantiator。

Menu {
    id: recentFilesMenu

    Instantiator {
        model: recentFilesModel
        MenuItem {
            text: model.fileName
        }
        onObjectAdded: recentFilesMenu.insertItem(index, object)
        onObjectRemoved: recentFilesMenu.removeItem(object)
    }

    MenuSeparator {
        visible: recentFilesModel.count > 0
    }

    MenuItem {
        text: "Clear menu"
        enabled: recentFilesModel.count > 0
        onTriggered: recentFilesModel.clear()
    }
}
于 2013-09-30T09:40:49.477 回答
0

示例代码将解释一切:

    Menu {
        id: suggestionsMenu
        property var suggestions: []

        Instantiator {
            model: suggestionsMenu.suggestions
            onObjectAdded: suggestionsMenu.insertItem(index, object)
            onObjectRemoved: suggestionsMenu.removeItem(object)
            delegate: MenuItem {
                text: suggestionsMenu.suggestions[index]
                onTriggered: {
                    console.log(index + " : " + suggestionsMenu.suggestions[index])
                }
            }
        }
    }

现在在代码中你只需要调用这样 3 行:

onShowSuggestions: {
   console.log("Showing suggestions")
   console.log(suggestions)

   suggestionsMenu.clear()
   suggestionsMenu.suggestions = []
   suggestionsMenu.suggestions = suggestions
   suggestionsMenu.popup()
}

链接:

菜单 QML

实例化器 QML 类型

第1条

于 2017-03-11T00:06:21.497 回答