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 | |
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>
-rw-r--r-- | src/qmlmodels/qqmldelegatemodel_p_p.h | 6 | ||||
-rw-r--r-- | src/qmlmodels/qqmldmabstractitemmodeldata_p.h | 6 | ||||
-rw-r--r-- | src/qmlmodels/qqmldmlistaccessordata_p.h | 4 | ||||
-rw-r--r-- | src/qmlmodels/qqmldmobjectdata_p.h | 4 | ||||
-rw-r--r-- | tests/auto/qml/qqmldelegatemodel/data/overriddenModelData.qml | 55 | ||||
-rw-r--r-- | tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp | 29 |
6 files changed, 94 insertions, 10 deletions
diff --git a/src/qmlmodels/qqmldelegatemodel_p_p.h b/src/qmlmodels/qqmldelegatemodel_p_p.h index e20a0b129a..b6b25b7776 100644 --- a/src/qmlmodels/qqmldelegatemodel_p_p.h +++ b/src/qmlmodels/qqmldelegatemodel_p_p.h @@ -66,9 +66,9 @@ class QQmlDelegateModelItem : public QObject { Q_OBJECT Q_PROPERTY(int index READ modelIndex NOTIFY modelIndexChanged) - Q_PROPERTY(int row READ modelRow NOTIFY rowChanged REVISION(2, 12) FINAL) - Q_PROPERTY(int column READ modelColumn NOTIFY columnChanged REVISION(2, 12) FINAL) - Q_PROPERTY(QObject *model READ modelObject CONSTANT FINAL) + Q_PROPERTY(int row READ modelRow NOTIFY rowChanged REVISION(2, 12)) + Q_PROPERTY(int column READ modelColumn NOTIFY columnChanged REVISION(2, 12)) + Q_PROPERTY(QObject *model READ modelObject CONSTANT) public: QQmlDelegateModelItem(const QQmlRefPointer<QQmlDelegateModelItemMetaType> &metaType, QQmlAdaptorModel::Accessors *accessor, int modelIndex, diff --git a/src/qmlmodels/qqmldmabstractitemmodeldata_p.h b/src/qmlmodels/qqmldmabstractitemmodeldata_p.h index ba3763485d..e3769b6d98 100644 --- a/src/qmlmodels/qqmldmabstractitemmodeldata_p.h +++ b/src/qmlmodels/qqmldmabstractitemmodeldata_p.h @@ -25,9 +25,9 @@ class VDMAbstractItemModelDataType; class QQmlDMAbstractItemModelData : public QQmlDelegateModelItem { Q_OBJECT - Q_PROPERTY(bool hasModelChildren READ hasModelChildren CONSTANT FINAL) - Q_PROPERTY(QVariant modelData READ modelData WRITE setModelData NOTIFY modelDataChanged FINAL) - QT_ANONYMOUS_PROPERTY(QVariant READ modelData NOTIFY modelDataChanged) + Q_PROPERTY(bool hasModelChildren READ hasModelChildren CONSTANT) + Q_PROPERTY(QVariant modelData READ modelData WRITE setModelData NOTIFY modelDataChanged) + QT_ANONYMOUS_PROPERTY(QVariant READ modelData NOTIFY modelDataChanged FINAL) public: QQmlDMAbstractItemModelData( diff --git a/src/qmlmodels/qqmldmlistaccessordata_p.h b/src/qmlmodels/qqmldmlistaccessordata_p.h index 12ec484a9c..e0fe24c1e1 100644 --- a/src/qmlmodels/qqmldmlistaccessordata_p.h +++ b/src/qmlmodels/qqmldmlistaccessordata_p.h @@ -26,8 +26,8 @@ class VDMListDelegateDataType; class QQmlDMListAccessorData : public QQmlDelegateModelItem { Q_OBJECT - Q_PROPERTY(QVariant modelData READ modelData WRITE setModelData NOTIFY modelDataChanged FINAL) - QT_ANONYMOUS_PROPERTY(QVariant READ modelData WRITE setModelData NOTIFY modelDataChanged) + Q_PROPERTY(QVariant modelData READ modelData WRITE setModelData NOTIFY modelDataChanged) + QT_ANONYMOUS_PROPERTY(QVariant READ modelData WRITE setModelData NOTIFY modelDataChanged FINAL) public: QQmlDMListAccessorData( const QQmlRefPointer<QQmlDelegateModelItemMetaType> &metaType, diff --git a/src/qmlmodels/qqmldmobjectdata_p.h b/src/qmlmodels/qqmldmobjectdata_p.h index 3d640536b0..0368572b36 100644 --- a/src/qmlmodels/qqmldmobjectdata_p.h +++ b/src/qmlmodels/qqmldmobjectdata_p.h @@ -27,8 +27,8 @@ class VDMObjectDelegateDataType; class QQmlDMObjectData : public QQmlDelegateModelItem, public QQmlAdaptorModelProxyInterface { Q_OBJECT - Q_PROPERTY(QObject *modelData READ modelData NOTIFY modelDataChanged FINAL) - QT_ANONYMOUS_PROPERTY(QObject * READ modelData NOTIFY modelDataChanged) + Q_PROPERTY(QObject *modelData READ modelData NOTIFY modelDataChanged) + QT_ANONYMOUS_PROPERTY(QObject * READ modelData NOTIFY modelDataChanged FINAL) Q_INTERFACES(QQmlAdaptorModelProxyInterface) public: QQmlDMObjectData( 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; |