qt - QML中ApplicationWindow的MenuBar动态添加Menu
问题描述
我正在尝试创建一个可通过插件扩展的应用程序。现在插件应该能够在菜单栏中动态添加菜单。
从文档中我可以找到 QtLabsPlatform 提供的 MenuBar。这有一个方法 addMenu。但 Windows 不在支持的平台列表中。所以我不能从中受益。
我尝试了Error added a Menu in QML 中建议的占位符技术,但这不适用于 QtQuick.Controls 2.13
解决方案
在您指出的问题的@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)
}
}
}
推荐阅读
- dart - 即使我的应用程序离线,我如何仍然保留我的数据
- azure - Azure:无法 ping SMTP 服务器,当前为使用 Azure 经典 VM 部署的应用程序使用 Gmail SMTP 服务器
- python - 删除时信用卡验证表单错误
- python-3.x - 是否可以放两个for循环来制作列表?
- android - 为什么我的联系人查询会提供具有不同 ID 的联系人?
- java - 有没有办法管理安装的第三方应用程序的后台服务或让它们休眠一段时间?
- r - 在 Shiny 中隔离反应性 data.frames 列表
- node.js - 拆分具有多个值的字段的值
- java - getRemoteSocketAddress 一起返回 url 和 ip 地址
- batch-file - 使用 Windows 帐户列表使用 SIDS 添加 reg 密钥