如何在没有警告的情况下调用QML Menu :: addMenu?

时间:2015-08-12 08:34:37

标签: qt qml qtquick2 qt5.4

我想动态构建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();
        }
    }
}

我在这里做错了什么?

2 个答案:

答案 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
    }
...

也许这有帮助。