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对象。但实际上,您可以直接从对象创建连接。第一条消息已更新