diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2024-02-05 12:51:24 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2024-02-09 17:41:47 +0100 |
commit | 72c8d39da2afd5c2a9c94869aa79a62bca89c803 (patch) | |
tree | 75e300ab9c67fd19b2e8be7ebefb8125ee337345 /tests/auto/qml/qqmldelegatemodel | |
parent | 9859107081b2af18b2964d6e22e3c425ff4e7cdf (diff) |
QmlModels: Make model object properties non-FINAL again
You can override them from your model after all. The anonymous
properties can be final, though. They're impossible to override.
Amends commit 2af5cc0a7f62680f41e83f32d2ecac502db5c1e7.
Pick-to: 6.7 6.6
Fixes: QTBUG-120499
Change-Id: Ib251f8a1845366074faec2db4914855c04b4db34
Reviewed-by: Olivier De Cannière <olivier.decanniere@qt.io>
Reviewed-by: Vladimir Belyavsky <belyavskyv@gmail.com>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Diffstat (limited to 'tests/auto/qml/qqmldelegatemodel')
-rw-r--r-- | tests/auto/qml/qqmldelegatemodel/data/overriddenModelData.qml | 55 | ||||
-rw-r--r-- | tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp | 29 |
2 files changed, 84 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmldelegatemodel/data/overriddenModelData.qml b/tests/auto/qml/qqmldelegatemodel/data/overriddenModelData.qml new file mode 100644 index 0000000000..e392b2e5c9 --- /dev/null +++ b/tests/auto/qml/qqmldelegatemodel/data/overriddenModelData.qml @@ -0,0 +1,55 @@ +import QtQml + +DelegateModel { + id: root + + property ListModel listModel: ListModel { + ListElement { + modelData: "a" + row: "b" + column: "c" + model: "d" + hasModelChildren: "e" + index: "f" + } + } + + property var array: [{ + modelData: "a", + row: "b", + column: "c", + model: "d", + hasModelChildren: "e", + index: "f" + }] + + property QtObject object: QtObject { + property string modelData: "a" + property string row: "b" + property string column: "c" + property string model: "d" + property string hasModelChildren: "e" + property string index: "f" + } + + property int n: -1 + + model: { + switch (n) { + case 0: return listModel + case 1: return array + case 2: return object + } + return undefined; + } + + delegate: QtObject { + required property string modelData + required property string row + required property string column + required property string model + required property string hasModelChildren + required property string index + objectName: [modelData, row, column, model, hasModelChildren, index].join(" ") + } +} diff --git a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp index c3b184e869..e3fa762b25 100644 --- a/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp +++ b/tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp @@ -35,6 +35,7 @@ private slots: void universalModelData(); void typedModelData(); void requiredModelData(); + void overriddenModelData(); void deleteRace(); void persistedItemsStayInCache(); void unknownContainersAsModel(); @@ -474,6 +475,34 @@ void tst_QQmlDelegateModel::requiredModelData() } } +void tst_QQmlDelegateModel::overriddenModelData() +{ + QTest::failOnWarning(QRegularExpression( + "Final member [^ ]+ is overridden in class [^\\.]+. The override won't be used.")); + + QQmlEngine engine; + QQmlComponent c(&engine, testFileUrl("overriddenModelData.qml")); + QVERIFY2(c.isReady(), qPrintable(c.errorString())); + QScopedPointer<QObject> o(c.create()); + + QQmlDelegateModel *delegateModel = qobject_cast<QQmlDelegateModel *>(o.data()); + QVERIFY(delegateModel); + + for (int i = 0; i < 3; ++i) { + delegateModel->setProperty("n", i); + QObject *delegate = delegateModel->object(0); + QVERIFY(delegate); + + if (i == 2) { + // Someone is certainly relying on this. + // We need to find a migration mechanism to fix it. + QEXPECT_FAIL("", "You can actually not override if the model is a QObject", Continue); + } + + QCOMPARE(delegate->objectName(), QLatin1String("a b c d e f")); + } +} + void tst_QQmlDelegateModel::deleteRace() { QQmlEngine engine; |