diff --git a/src/core/krearrangecolumnsproxymodel.cpp b/src/core/krearrangecolumnsproxymodel.cpp --- a/src/core/krearrangecolumnsproxymodel.cpp +++ b/src/core/krearrangecolumnsproxymodel.cpp @@ -25,7 +25,11 @@ void KRearrangeColumnsProxyModel::setSourceColumns(const QVector &columns) { + // We could use layoutChanged() here, but we would have to map persistent + // indexes from the old to the new location... + beginResetModel(); d_ptr->m_sourceColumns = columns; + endResetModel(); } int KRearrangeColumnsProxyModel::columnCount(const QModelIndex &parent) const diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -2,3 +2,20 @@ remove_definitions(-DQT_NO_CAST_FROM_ASCII) add_subdirectory(proxymodeltestapp) + +find_package(Qt5Widgets ${REQUIRED_QT_VERSION} CONFIG) +if (Qt5Widgets_FOUND) + macro(KITEMMODELS_WIDGETS_TESTS) + foreach(_testname ${ARGN}) + add_executable(${_testname} ${_testname}.cpp) + target_link_libraries(${_testname} + KF5::ItemModels + Qt5::Widgets) + ecm_mark_as_test(${_testname}) + endforeach() + endmacro(KITEMMODELS_WIDGETS_TESTS) + + KITEMMODELS_WIDGETS_TESTS( + rearrangecolumns + ) +endif() diff --git a/tests/rearrangecolumns.cpp b/tests/rearrangecolumns.cpp new file mode 100644 --- /dev/null +++ b/tests/rearrangecolumns.cpp @@ -0,0 +1,41 @@ +#include +#include +#include +#include +#include + +// Prepares one row for a QStandardItemModel +inline QList makeStandardItems(const QStringList &texts) +{ + QList items; + items.reserve(texts.count()); + for (const QString &txt : texts) { + items << new QStandardItem(txt); + } + return items; +} + +int main(int argc, char** argv) +{ + QApplication app(argc, argv); + + QStandardItemModel source; + source.insertRow(0, makeStandardItems({QStringLiteral("A0"), QStringLiteral("B0"), QStringLiteral("C0"), QStringLiteral("D0")})); + source.insertRow(1, makeStandardItems({QStringLiteral("A1"), QStringLiteral("B1"), QStringLiteral("C1"), QStringLiteral("D1")})); + source.insertRow(2, makeStandardItems({QStringLiteral("A2"), QStringLiteral("B2"), QStringLiteral("C2"), QStringLiteral("D2")})); + source.setHorizontalHeaderLabels({QStringLiteral("H1"), QStringLiteral("H2"), QStringLiteral("H3"), QStringLiteral("H4")}); + + KRearrangeColumnsProxyModel pm; + pm.setSourceColumns(QVector{2, 3, 1, 0}); + pm.setSourceModel(&source); + + QTreeView treeView; + treeView.setModel(&pm); + treeView.show(); + + QTimer::singleShot(500, &pm, [&]() { + pm.setSourceColumns(QVector() << 2 << 1 << 0 << 3); + }); + + return app.exec(); +}