将二维 QVariantList 从 C++ 传递到 QML
Passing 2-dimensional QVariantList from C++ to QML
我真的很困惑如何将二维 QVariantList 从 C++ 传递到 QML,我基本上想从 C++ 传递一个值,这与在 QML 中分配它的作用相同:
property var twoDim: [["1-1", "1-2"],["2-1", "2-2"]]
这样我就可以将数组用作 Repeater
元素中的模型,方法是:modelData[0]
将 return 第一个值数组,以及 modelData[1]
将 return 第二个值数组。例如名字和姓氏...
请帮忙
首先你可以有 QVariantList
个 QVariantList
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 programming 的内容,您应该花一些时间来学习这个主题,因为它是 Qt 的大部分基础。
我真的很困惑如何将二维 QVariantList 从 C++ 传递到 QML,我基本上想从 C++ 传递一个值,这与在 QML 中分配它的作用相同:
property var twoDim: [["1-1", "1-2"],["2-1", "2-2"]]
这样我就可以将数组用作 Repeater
元素中的模型,方法是:modelData[0]
将 return 第一个值数组,以及 modelData[1]
将 return 第二个值数组。例如名字和姓氏...
请帮忙
首先你可以有 QVariantList
个 QVariantList
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 programming 的内容,您应该花一些时间来学习这个主题,因为它是 Qt 的大部分基础。