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

时间:2013-09-28 09:27:38

标签: qt qml qt-quick

我想动态创建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

3 个答案:

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

链接:

Menu QML

Instantiator QML Type

Article #1