为什么QList不能作为QML GridView的模型工作



我在QML中从C++端将模型设置为GridView时遇到问题。从qml中关于将Model设置为GridView的文档中可以看出:

如果使用C++模型类,它必须是QAbstractItemModel或简单列表。

在我的情况下,我的数据是矩阵(9x9(中的数字,所以我认为最简单的方法是在QML GridView中使用简单的整数列表作为模型。我的QML网格视图是:

GridView
{
id: gridView
width: root.gridSize
height: root.gridSize
Layout.alignment: Qt.AlignHCenter
model: gridModel
delegate: Text { text: modelData }
}

main.cpp测试中,我尝试了这种方式:

QList<int> test;
test << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 11;
engine.rootContext()->setContextProperty("gridModel", QVariant::fromValue(test));

这不起作用,数据也不会显示在qml中。此外,如果我尝试QList<QString>,QML中也不会显示数据。

但如果我试着这样使用QStringList,它是有效的:

QStringList test;
test << "1" << "2" << "3" << "4" << "5" << "6" << "7" << "11";
engine.rootContext()->setContextProperty("gridModel", QVariant::fromValue(test));

我做错了什么?为什么QStringList有效而QList<QString>无效?既然QStringList继承了QList,这是否意味着它应该和QList<QString>一样?我的目标是使用整数列表作为网格视图的模型,但这也让我对字符串感到困惑。

一种可能的解决方案是使用QVariantList:

QVariantList test;
test << 1 << 2 << 3 << 4 << 5 << 6 << 7 << 11;
engine.rootContext()->setContextProperty("gridModel", test);

另一方面,以透明的方式将QList<int>QList<QString>转换为QML阵列是有效的,这是可以验证的,因为除了对象具有length属性之外,还可以使用[]访问元素。

问题似乎是视图只支持它从QAbstractItemModel、QStringList、QVariantList和数字继承的类,而不支持其他项。

最新更新