首页 > 解决方案 > QML中ApplicationWindow的MenuBar动态添加Menu

问题描述

我正在尝试创建一个可通过插件扩展的应用程序。现在插件应该能够在菜单栏中动态添加菜单。

从文档中我可以找到 QtLabsPlatform 提供的 MenuBar。这有一个方法 addMenu。但 Windows 不在支持的平台列表中。所以我不能从中受益。

我尝试了Error added a Menu in QML 中建议的占位符技术,但这不适用于 QtQuick.Controls 2.13

标签: qtqml

解决方案


在您指出的问题的@timday 答案中表示答案,但未显示示例:

... 菜单的动态创建有点困难;请参阅 Qt.createQmlObject 或 Qt.createComponent 文档。(在代码中声明所有你需要的可能会更简单,但它们的可见属性连接到任何合适的逻辑)。...

(强调我的)

所以我的回答只是向您展示如何做到这一点,尽管我认为您想动态地将 MenuItem 添加到菜单中,而不是将菜单添加到 MenuBar:

import QtQuick 2.13
import QtQuick.Controls 2.13


ApplicationWindow {
    id: root
    width: 640
    height: 480
    visible: true
    menuBar: MenuBar {
        Menu {
            id: plugins_menu
            title: qsTr("&Plugins")   
        }
    }
    function onTriggered(item){
        console.log(item.text)
    }
    Component.onCompleted:{
        var plugin_names = ["plugin1", "plugin2", "plugin3"]
        for(var i in plugin_names){
            var item = Qt.createQmlObject('import QtQuick 2.13; import QtQuick.Controls 2.13; MenuItem {}',
                                       plugins_menu)
            item.text = plugin_names[i]
            plugins_menu.addItem(item)
            var f = function(it){ 
                it.triggered.connect(function (){ root.onTriggered(it)
            })}
            f(item)
        }
    }
}

推荐阅读