diff --git a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp index 3b90858984a..db1e041137f 100644 --- a/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp +++ b/src/corelib/itemmodels/qconcatenatetablesproxymodel.cpp @@ -540,6 +540,23 @@ void QConcatenateTablesProxyModel::removeSourceModel(QAbstractItemModel *sourceM d->updateColumnCount(); } +/*! + \since 6.9.0 + \reimp + Returns the union of the roleNames() of the underlying models. + + In case source models associate different names to the same role, + the name used in last source model overrides the name used in earlier models. +*/ +QHash QConcatenateTablesProxyModel::roleNames() const +{ + Q_D(const QConcatenateTablesProxyModel); + QHash ret = QAbstractItemModel::roleNames(); + for (const auto &[model, _] : d->m_models) + ret.insert(model->roleNames()); + return ret; +} + void QConcatenateTablesProxyModelPrivate::slotRowsAboutToBeInserted(const QModelIndex &parent, int start, int end) { diff --git a/src/corelib/itemmodels/qconcatenatetablesproxymodel.h b/src/corelib/itemmodels/qconcatenatetablesproxymodel.h index 9dbebd7b888..c432597dc16 100644 --- a/src/corelib/itemmodels/qconcatenatetablesproxymodel.h +++ b/src/corelib/itemmodels/qconcatenatetablesproxymodel.h @@ -42,6 +42,7 @@ public: bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const override; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override; QSize span(const QModelIndex &index) const override; + QHash roleNames() const override; private: Q_DECLARE_PRIVATE(QConcatenateTablesProxyModel) diff --git a/src/gui/itemmodels/qstandarditemmodel.cpp b/src/gui/itemmodels/qstandarditemmodel.cpp index 0eb64c16957..05f02022363 100644 --- a/src/gui/itemmodels/qstandarditemmodel.cpp +++ b/src/gui/itemmodels/qstandarditemmodel.cpp @@ -2251,7 +2251,7 @@ void QStandardItemModel::setItemRoleNames(const QHash &roleNames } /*! - reimp + \reimp */ QHash QStandardItemModel::roleNames() const { diff --git a/tests/auto/corelib/itemmodels/qconcatenatetablesproxymodel/tst_qconcatenatetablesproxymodel.cpp b/tests/auto/corelib/itemmodels/qconcatenatetablesproxymodel/tst_qconcatenatetablesproxymodel.cpp index b15ba191e5d..edb1b934f9f 100644 --- a/tests/auto/corelib/itemmodels/qconcatenatetablesproxymodel/tst_qconcatenatetablesproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qconcatenatetablesproxymodel/tst_qconcatenatetablesproxymodel.cpp @@ -86,6 +86,8 @@ private Q_SLOTS: void qtbug91788(); void qtbug91878(); void createPersistentOnLayoutAboutToBeChanged(); + void shouldMergeRoleNames(); + private: QStandardItemModel mod; QStandardItemModel mod2; @@ -99,11 +101,13 @@ void tst_QConcatenateTablesProxyModel::init() mod.appendRow({ new QStandardItem(QStringLiteral("A")), new QStandardItem(QStringLiteral("B")), new QStandardItem(QStringLiteral("C")) }); mod.setHorizontalHeaderLabels(QStringList() << QStringLiteral("H1") << QStringLiteral("H2") << QStringLiteral("H3")); mod.setVerticalHeaderLabels(QStringList() << QStringLiteral("One")); + mod.setItemRoleNames({ { Qt::UserRole, "user" } }); mod2.clear(); mod2.appendRow({ new QStandardItem(QStringLiteral("D")), new QStandardItem(QStringLiteral("E")), new QStandardItem(QStringLiteral("F")) }); mod2.setHorizontalHeaderLabels(QStringList() << QStringLiteral("H1") << QStringLiteral("H2") << QStringLiteral("H3")); mod2.setVerticalHeaderLabels(QStringList() << QStringLiteral("Two")); + mod2.setItemRoleNames({ { Qt::UserRole + 1, "user+1" } }); mod3.clear(); mod3.appendRow({ new QStandardItem(QStringLiteral("1")), new QStandardItem(QStringLiteral("2")), new QStandardItem(QStringLiteral("3")) }); @@ -927,6 +931,23 @@ void tst_QConcatenateTablesProxyModel::createPersistentOnLayoutAboutToBeChanged( QCOMPARE(layoutChangedSpy.size(), 1); } +void tst_QConcatenateTablesProxyModel::shouldMergeRoleNames() +{ + // Given a combining proxy + QConcatenateTablesProxyModel pm; + + // When adding three source models + pm.addSourceModel(&mod); + pm.addSourceModel(&mod2); + pm.addSourceModel(&mod3); + + // Then the role names should be merged + const auto roleNames = pm.roleNames(); + QCOMPARE(roleNames[Qt::DisplayRole], "display"); + QCOMPARE(roleNames[Qt::UserRole], "user"); + QCOMPARE(roleNames[Qt::UserRole + 1], "user+1"); +} + QTEST_GUILESS_MAIN(tst_QConcatenateTablesProxyModel) #include "tst_qconcatenatetablesproxymodel.moc"