我想动态构建QML上下文菜单。 当我调用'addMenu'时,会添加菜单条目,但我收到此警告:
QQmlComponent:创建的图形对象未放置在图形场景中。
以下是重现此问题的代码:
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
ApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480
Menu {
id:contextMenu
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.RightButton
onClicked: {
contextMenu.addMenu("NewMenu");
contextMenu.popup();
}
}
}
我在这里做错了什么?
答案 0 :(得分:1)
这看起来像是Qt中的一个错误。如果您查看order_by
(定义了菜单QML组件),Menu.qml
定义如下:
addMenu
这里的重要一行是function addMenu(title) {
return root.insertMenu(items.length, title)
}
function insertMenu(index, title) {
if (!__selfComponent)
__selfComponent = Qt.createComponent("Menu.qml", root)
var submenu = __selfComponent.createObject(__selfComponent, { "title": title })
root.insertItem(index, submenu)
return submenu
}
/*! \internal */
property Component __selfComponent: null
。这会将__selfComponent.createObject(__selfComponent, { "title": title })
(菜单组件,而不是菜单本身)设置为新创建的子菜单的父级。我认为这是错误的,父母应该设置为__selfComponent
菜单本身。
答案 1 :(得分:0)
将visible: true
添加到ApplicationWindow
,就像那样:
ApplicationWindow {
title: qsTr("Hello World")
width: 640
height: 480
visible: true
Menu {
id:contextMenu
}
...
也许这有帮助。