将二维QVariantList从c++传递到QML

Passing 2-dimensional QVariantList from C++ to QML

本文关键字:c++ QML QVariantList 二维      更新时间:2023-10-16

我真的很困惑如何将二维QVariantList从c++传递到QML,我基本上想从c++传递一个值,这将像在QML中分配它一样:

property var twoDim: [["1-1", "1-2"],["2-1", "2-2"]]

这样我就可以使用数组作为Repeater元素的模型,通过这样做:modelData[0]将返回第一个值数组,modelData[1]将返回第二个值数组。

请帮

首先你可以有一个QVariantListQVariantList s:

// main.cpp
int main( int argc, char* argv[] )
{
    QGuiApplication app( argc, argv );
    auto myList = QVariantList{};
    for ( auto i = 0; i < 2; ++i ) {
        myList << QVariant::fromValue(
                        QVariantList{ QString::number( i + 1 ) + "-1",
                                      QString::number( i + 1 ) + "-2" } );
    }
    auto view = QQuickView{};
    view.rootContext()->setContextProperty( "myList", myList );
    view.setSource( QUrl{ QStringLiteral{ "qrc:/QmlCppTest.qml" } } );
    view.show();
    return app.exec();
}
// QmlCppTest.qml
import QtQuick 2.3
Item {
    property var listOfLists: myList
    Component.onCompleted: {
        for ( var i = 0; i < listOfLists.length; ++i ) {
            for ( var j = 0; j < listOfLists[i].length; ++j ) {
                print( i, j, listOfLists[i][j] );
            }
        }
    }
}

结果:

qml: 0 0 1-1
qml: 0 1 1-2
qml: 1 0 2-1
qml: 1 1 2-2

但是就像我在评论中说的,如果你的第一个维度代表一个实体,而第二个维度代表该实体的属性,那么出于性能和维护的原因,更好的方法是使用QAbstractItemModel(或它的一个更具体的派生类)。

Qt的文档有很多关于MVC编程的东西,你应该花一些时间来学习这个主题,因为它是Qt的基础。