Qt 在ECMAscript中为刚创建的项添加信号处理程序

Qt 在ECMAscript中为刚创建的项添加信号处理程序,qt,qml,qt-quick,Qt,Qml,Qt Quick,我想动态创建MenuItem,并为其添加onTriggered回调 var m = backContextMenu.insertItem(0,text) m.onTriggered = ..? //function(x) { console.log('asd') } 它给出了一个错误无法分配给只读属性“onTriggered”。我能做什么?也许我应该使用Qt.createQmlObject('qml-code…')创建菜单?或者我应该以声明方式创建MenuItem模板,并以某种方式克隆此对

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

var m = backContextMenu.insertItem(0,text) 

m.onTriggered = ..? //function(x) { console.log('asd') }
它给出了一个错误
无法分配给只读属性“onTriggered”
。我能做什么?也许我应该使用
Qt.createQmlObject('qml-code…')
创建菜单?或者我应该以声明方式创建
MenuItem
模板,并以某种方式克隆此对象


注意:我使用Qt 5.2中的控件
QtQuick中的
MenuItem
。您可以使用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)

我很幸运地发现可以通过实例化器动态添加菜单项

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

示例代码将解释一切:

    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()
}
链接:


您是否建议为我的菜单项生成
id
,使用合适的
onTriggered
主体生成上面的代码,并使用
Qt.createQmlObject
对其进行评估?我问这个问题是因为我不明白如何将上面的一段代码用于多个目标。因此,我读到不可能分配id:是的,但不必生成id。如果您在JS函数中,则必须使用createQmlObject创建Connections对象。但实际上,您可以直接从对象创建连接。第一条消息已更新