aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2024-02-05 12:51:24 +0100
committerUlf Hermann <ulf.hermann@qt.io>2024-02-09 17:41:47 +0100
commit72c8d39da2afd5c2a9c94869aa79a62bca89c803 (patch)
tree75e300ab9c67fd19b2e8be7ebefb8125ee337345
parent9859107081b2af18b2964d6e22e3c425ff4e7cdf (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.h6
-rw-r--r--src/qmlmodels/qqmldmabstractitemmodeldata_p.h6
-rw-r--r--src/qmlmodels/qqmldmlistaccessordata_p.h4
-rw-r--r--src/qmlmodels/qqmldmobjectdata_p.h4
-rw-r--r--tests/auto/qml/qqmldelegatemodel/data/overriddenModelData.qml55
-rw-r--r--tests/auto/qml/qqmldelegatemodel/tst_qqmldelegatemodel.cpp29
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;