【问题标题】:QML - Filling menu with model itemsQML - 用模型项填充菜单
【发布时间】:2017-08-12 16:28:46
【问题描述】:

我正在尝试从ListModel 动态填充Menu,但这种方法不起作用(当我右键单击菜单时不会显示任何内容):

这是我的菜单项:

import QtQuick.Controls 1.3

ListModel{
    id:menuItems
    ListElement{
        text:"hello1"
    }
    ListElement{
        text:"hello2"
    }
    ListElement{
        text:"hello3"
    }
}

这是我的菜单

Menu{
    id:contextMenu
    Repeater{
    model: menuItems
    MenuItem{}

}

我什至尝试输入Instantiator,但菜单不会显示任何内容

【问题讨论】:

    标签: qt qml qtquickcontrols


    【解决方案1】:

    查看文档后,我想出了如何实现这一点:

    Menu {
        id: contextMenu
    
        Instantiator {
           model: menuItems
           MenuItem {
              text: model.text
           }
    
           // The trick is on those two lines
           onObjectAdded: contextMenu.insertItem(index, object)
           onObjectRemoved: contextMenu.removeItem(object)
       }
    }
    

    【讨论】:

    • 请在您的问题中添加以下信息(作为导入和标签) - 您的 QtQuick.Controls 使用哪个版本?是QtQuick.Controls 1.x(标签:qtquickcontrols)还是QtQuick.Controls 2.x(标签:qtquickcontrols2)
    【解决方案2】:

    您只需将每个 ListElement 的文本添加到您的 MenuItem 中,如下所示:

    Menu{
        id:contextMenu
        visible: true
        Repeater {
            model: menuItems
            MenuItem {
                text: modelData
            }
        }
    }
    

    我还在你的菜单中添加了“visible: true”来显示它(我不知道你是否在其他地方打开它)。

    【讨论】:

    • 您有任何错误吗?菜单是否显示或菜单是否充满空条目?答案已经用 Qt 5.9.0 进行了测试
    • 我使用的是 Qt 5.9.1,但没有显示错误。菜单只是不显示
    • 但是我从文档中弄清楚了如何做到这一点,我已经发布了答案
    • 如果使用的版本是QtQuick.Controls 2.x,则需要插入两行:onItemAdded: contextMenu.insertItem(index, item)onItemRemoved: contextMenu.removeItem(item)。在旧版本中,MenuItem 不是 Item
    猜你喜欢
    • 2023-02-10
    • 1970-01-01
    • 1970-01-01
    • 2023-02-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多