diff options
author | Volker Hilsheimer <[email protected]> | 2025-07-02 23:59:21 +0200 |
---|---|---|
committer | Volker Hilsheimer <[email protected]> | 2025-07-03 23:11:37 +0200 |
commit | 22effeae2ca4565ad537ac95f638754a92afcf72 (patch) | |
tree | efb981d721a3e57c15f7f6c98f252d65fe227149 /tests/auto | |
parent | b6faf63995b63d5958cf4b95ad1e9bab17d1bc6d (diff) |
QRangeModel: consistently call roleNames() through the vtable
Calling the implementation of roleNames() directly breaks overrides, as
we get inconsistent results.
Add a testcase that verifies that we can call setData and itemData on
a list of QObject subclasses.
Pick-to: 6.10
Change-Id: Ia4fc7859bf9136a6c3452e1317a856c790916315
Reviewed-by: Fabian Kosmale <[email protected]>
Diffstat (limited to 'tests/auto')
-rw-r--r-- | tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp b/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp index 5a49d9cf024..878fd173675 100644 --- a/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp +++ b/tests/auto/corelib/itemmodels/qrangemodel/tst_qrangemodel.cpp @@ -286,6 +286,7 @@ private slots: void ranges(); void json(); void ownership(); + void overrideRoleNames(); void dimensions_data() { createTestData(); } void dimensions(); @@ -1008,6 +1009,45 @@ void tst_QRangeModel::ownership() } } +void tst_QRangeModel::overrideRoleNames() +{ + // verify that an overridden roleNames() gets called consistently + class RoleModel : public QRangeModel + { + public: + RoleModel() : QRangeModel(QList<SingleColumn<Object *>>{ + new Object, + new Object, + new Object, + }) { + } + + QHash<int, QByteArray> roleNames() const override + { + return { + {Qt::UserRole, "string"}, + {Qt::UserRole + 1, "number"} + }; + } + }; + + RoleModel model; + const QList<int> expectedKeys = {Qt::UserRole, Qt::UserRole + 1}; + QCOMPARE(model.roleNames().size(), expectedKeys.size()); + + const QModelIndex index = model.index(0, 0); + QVERIFY(model.setData(index, "string value", Qt::UserRole)); + QVERIFY(model.setData(index, 42, Qt::UserRole + 1)); + QVERIFY(!model.setData(index, "display")); + + const auto itemData = model.itemData(index); + QCOMPARE(itemData.keys(), expectedKeys); + QCOMPARE(itemData.value(Qt::UserRole), "string value"); + QCOMPARE(itemData.value(Qt::UserRole + 1), 42); + + QVERIFY(model.setItemData(model.index(1, 0), itemData)); +} + void tst_QRangeModel::dimensions() { QFETCH(Factory, factory); |