我想动态创建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
模板并以某种方式克隆此对象?
P.S。我在Qt 5.2中使用MenuItem
中的QtQuick.Controls
答案 0 :(得分: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)
答案 1 :(得分:0)
我很幸运能够找到another way动态添加菜单项:通过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()
}
}
答案 2 :(得分: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()
}
链接: