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

Posted

技术标签:

【中文标题】如何在没有警告的情况下调用 QML Menu::addMenu?【英文标题】:How to call QML Menu::addMenu without warnings? 【发布时间】:2015-08-12 08:34:36 【问题描述】:

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

我在这里做错了什么?

【问题讨论】:

它适用于 5.5 没有警告,所以也许你只需要更新。 就像说@folibis 在 5.5 上没有警告,试试这个也许会更好contextMenu.insertMenu(contextMenu.__currentIndex,"NewMenu") 谢谢@folibis,我会更新的。 【参考方案1】:

对我来说,这看起来像是 Qt 中的一个错误。如果您查看Menu.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(菜单组件,而不是菜单本身)设置为新创建的子菜单的父级。我认为这是错误的,应该将父级设置为root,即菜单本身。

【讨论】:

【参考方案2】:

像这样将visible: true 添加到ApplicationWindow

ApplicationWindow 
    title: qsTr("Hello World")
    width: 640
    height: 480
    visible: true
    Menu 
        id:contextMenu
    
...

也许有帮助。

【讨论】:

以上是关于如何在没有警告的情况下调用 QML Menu::addMenu?的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用特定的 QML 调试器警告

如何在 qml 中没有 listmodel 的情况下存储嵌套 ListView 的数据并在之后检索

在 PHP 5.3 中,如何在没有严格警告的情况下在一行中获取单个元素数组中的值

如何分析“绑定循环”

在没有 QML 的情况下部署 Qt 项目

如何从 QML 组件调用自定义信号?