From c55a7e4167c3174120f1fb32c7e7d1756cc3960d Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Sun, 24 Sep 2023 19:41:42 +0200 Subject: [PATCH] Widgets/Itemviews: use pmf-style connect in QTreeWidget Replace all connect() calls with pmf-style connection syntax. This also means that we have to properly disconnect everything in the ctor to not trigger an assertion in QtPrivate::assertObjectType(). Task-number: QTBUG-117698 Change-Id: I652c8d6f27b23a7d4467dc39b7c12850f4d25f66 Reviewed-by: Axel Spoerl --- src/widgets/itemviews/qtreewidget.cpp | 59 ++++++++++++++++----------- src/widgets/itemviews/qtreewidget_p.h | 5 +++ 2 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp index 3fa8a7e1b9..c261212113 100644 --- a/src/widgets/itemviews/qtreewidget.cpp +++ b/src/widgets/itemviews/qtreewidget.cpp @@ -2301,6 +2301,12 @@ QDataStream &operator>>(QDataStream &in, QTreeWidgetItem &item) #endif // QT_NO_DATASTREAM +void QTreeWidgetPrivate::clearConnections() +{ + for (const QMetaObject::Connection &connection : connections) + QObject::disconnect(connection); +} + void QTreeWidgetPrivate::_q_emitItemPressed(const QModelIndex &index) { Q_Q(QTreeWidget); @@ -2570,31 +2576,34 @@ void QTreeWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, QTreeWidget::QTreeWidget(QWidget *parent) : QTreeView(*new QTreeWidgetPrivate(), parent) { + Q_D(QTreeWidget); QTreeView::setModel(new QTreeModel(1, this)); - connect(this, SIGNAL(pressed(QModelIndex)), - SLOT(_q_emitItemPressed(QModelIndex))); - connect(this, SIGNAL(clicked(QModelIndex)), - SLOT(_q_emitItemClicked(QModelIndex))); - connect(this, SIGNAL(doubleClicked(QModelIndex)), - SLOT(_q_emitItemDoubleClicked(QModelIndex))); - connect(this, SIGNAL(activated(QModelIndex)), - SLOT(_q_emitItemActivated(QModelIndex))); - connect(this, SIGNAL(entered(QModelIndex)), - SLOT(_q_emitItemEntered(QModelIndex))); - connect(this, SIGNAL(expanded(QModelIndex)), - SLOT(_q_emitItemExpanded(QModelIndex))); - connect(this, SIGNAL(collapsed(QModelIndex)), - SLOT(_q_emitItemCollapsed(QModelIndex))); - connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), - this, SLOT(_q_emitCurrentItemChanged(QModelIndex,QModelIndex))); - connect(model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), - this, SLOT(_q_emitItemChanged(QModelIndex))); - connect(model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), - this, SLOT(_q_dataChanged(QModelIndex,QModelIndex))); - connect(model(), SIGNAL(columnsRemoved(QModelIndex,int,int)), - this, SLOT(_q_sort())); - connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), - this, SLOT(_q_selectionChanged(QItemSelection,QItemSelection))); + d->connections = { + QObjectPrivate::connect(this, &QTreeWidget::pressed, + d, &QTreeWidgetPrivate::_q_emitItemPressed), + QObjectPrivate::connect(this, &QTreeWidget::clicked, + d, &QTreeWidgetPrivate::_q_emitItemClicked), + QObjectPrivate::connect(this, &QTreeWidget::doubleClicked, + d, &QTreeWidgetPrivate::_q_emitItemDoubleClicked), + QObjectPrivate::connect(this, &QTreeWidget::activated, + d, &QTreeWidgetPrivate::_q_emitItemActivated), + QObjectPrivate::connect(this, &QTreeWidget::entered, + d, &QTreeWidgetPrivate::_q_emitItemEntered), + QObjectPrivate::connect(this, &QTreeWidget::expanded, + d, &QTreeWidgetPrivate::_q_emitItemExpanded), + QObjectPrivate::connect(this, &QTreeWidget::collapsed, + d, &QTreeWidgetPrivate::_q_emitItemCollapsed), + QObjectPrivate::connect(model(), &QAbstractItemModel::dataChanged, + d, &QTreeWidgetPrivate::_q_emitItemChanged), + QObjectPrivate::connect(model(), &QAbstractItemModel::dataChanged, + d, &QTreeWidgetPrivate::_q_dataChanged), + QObjectPrivate::connect(model(), &QAbstractItemModel::columnsRemoved, + d, &QTreeWidgetPrivate::_q_sort), + QObjectPrivate::connect(selectionModel(), &QItemSelectionModel::currentChanged, + d, &QTreeWidgetPrivate::_q_emitCurrentItemChanged), + QObjectPrivate::connect(selectionModel(), &QItemSelectionModel::selectionChanged, + d, &QTreeWidgetPrivate::_q_selectionChanged) + }; header()->setSectionsClickable(false); } @@ -2604,6 +2613,8 @@ QTreeWidget::QTreeWidget(QWidget *parent) QTreeWidget::~QTreeWidget() { + Q_D(QTreeWidget); + d->clearConnections(); } /* diff --git a/src/widgets/itemviews/qtreewidget_p.h b/src/widgets/itemviews/qtreewidget_p.h index fd7560ffd6..68d74798b9 100644 --- a/src/widgets/itemviews/qtreewidget_p.h +++ b/src/widgets/itemviews/qtreewidget_p.h @@ -23,6 +23,8 @@ #include #include +#include + QT_REQUIRE_CONFIG(treewidget); QT_BEGIN_NAMESPACE @@ -186,6 +188,7 @@ class QTreeWidgetPrivate : public QTreeViewPrivate Q_DECLARE_PUBLIC(QTreeWidget) public: QTreeWidgetPrivate() : QTreeViewPrivate(), explicitSortColumn(-1) {} + void clearConnections(); inline QTreeModel *treeModel() const { return qobject_cast(model); } inline QModelIndex index(const QTreeWidgetItem *item, int column = 0) const { return treeModel()->index(item, column); } @@ -206,6 +209,8 @@ public: // used by QTreeWidgetItem::sortChildren to make sure the column argument is used int explicitSortColumn; + + std::array connections; }; QT_END_NAMESPACE