c++ - Repeater 中的 QML ListView

标签 c++ qt listview qml repeater

如何为 ListView 分配不同的模型, 在 Repeater 内? 我做了一个草图(我的实际项目要大得多):

Column {
    Repeater {
        model: ["Line1","Line2","Line3","Line4"]
        Rectangle {
            ListView {
                model: ???
                delegate: Rectangle {
                    Text {
                        text: somemodelproperty
                    }                
                }
            }
        }
    }
}

目前,我正在通过复制粘贴 10 个矩形来解决这个问题,每个矩形包含一个 ListView .在 C++ 中,我实现了 10 QList<QObject*> ,并且每个列表都“有界”到 ListView通过做

QQmlContext * example = engine.rootContext();
example->setContextProperty(modelname,QVariant::fromValue(listobject));

我很确定有一种更智能的方法可以做到这一点,但我几天前才开始使用 QML,但找不到解决方案。

最佳答案

有一个问题,您不能将 id 用作列表元素的值,也不能将列表模型嵌套在列表元素中,至少不能直接嵌套。

但是您可以像这样填充它:

Item {
    id: models
    ListModel {/*...*/}
    ListModel {/*...*/}
    //...
}

ListModel {
    id: outerModel
}

function set() {
    for (var i = 0; i < models.data.length; ++i) {
        outerModel.append({"model": models.data[i] /* and other stuff */})
    }
}

或者,如果您更喜欢使用 C++ 数据,您可以向列表中的每个元素添加一个 QObject*“model”属性,并使用函数对其进行设置,如上例所示或使用您指定的内部模型的 id

再想一想,您可能想使用另一个名称而不是“model”,因为我无法想象 QML 会喜欢 model: model

更新:您可以尝试这样做(假设您的 10 个模型在 QML 中公开为 m1 - m10)

property var subModels: [m1, m2, ... m10]

然后对于中继器委托(delegate)内的 ListView,您可以:

ListView {
    model: subModels[index]
    // ...
}

然后假设您在转发器中有 10 个元素,每个 ListView 的模型将从具有适当元素索引的数组中选择。

关于c++ - Repeater 中的 QML ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29385552/

相关文章:

c++ - 为什么不弹出窗口?

c++ - 将 lambda 绑定(bind)到函数以获得返回结果

c++ - QSettings:是否可以禁用组?

c# - 是否可以创建使用 C# 或 C++ 代码的 Firefox 插件?如果是这样,如何?

c++ - Qt 4/5和Opengl API之间的opengl速度差异

c++ - 调整 Qml 窗口大小

android - 如何使用 Android HashMap<String, String> 距离值进行排序?

listview - SwiftUI - NavigationLink 的目的地创建具有额外空间的 View

android - 滚动自定义ListView时Android应用程序崩溃

c++ - 在 C/C++ 中为数组参数传递 NULL