From 2666c773bacc99fd6e003d5cb9595c7bd09cd351 Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Sun, 24 Sep 2023 19:42:59 +0200 Subject: [PATCH] Widgets/Itemviews: use pmf-style connect in QTableWidget 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: I2b5bb99c77e6e783a4cd7b0065d2f52a0266d88b Reviewed-by: Axel Spoerl --- src/widgets/itemviews/qtablewidget.cpp | 53 +++++++++++++++++--------- src/widgets/itemviews/qtablewidget_p.h | 5 +++ 2 files changed, 39 insertions(+), 19 deletions(-) diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index f9d2c8d59c..857d64b3dd 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -1592,25 +1592,38 @@ QTableWidgetItem &QTableWidgetItem::operator=(const QTableWidgetItem &other) void QTableWidgetPrivate::setup() { Q_Q(QTableWidget); - // view signals - QObject::connect(q, SIGNAL(pressed(QModelIndex)), q, SLOT(_q_emitItemPressed(QModelIndex))); - QObject::connect(q, SIGNAL(clicked(QModelIndex)), q, SLOT(_q_emitItemClicked(QModelIndex))); - QObject::connect(q, SIGNAL(doubleClicked(QModelIndex)), - q, SLOT(_q_emitItemDoubleClicked(QModelIndex))); - QObject::connect(q, SIGNAL(activated(QModelIndex)), q, SLOT(_q_emitItemActivated(QModelIndex))); - QObject::connect(q, SIGNAL(entered(QModelIndex)), q, SLOT(_q_emitItemEntered(QModelIndex))); - // model signals - QObject::connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), - q, SLOT(_q_emitItemChanged(QModelIndex))); - // selection signals - QObject::connect(q->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), - q, SLOT(_q_emitCurrentItemChanged(QModelIndex,QModelIndex))); - QObject::connect(q->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), - q, SIGNAL(itemSelectionChanged())); - // sorting - QObject::connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), - q, SLOT(_q_dataChanged(QModelIndex,QModelIndex))); - QObject::connect(model, SIGNAL(columnsRemoved(QModelIndex,int,int)), q, SLOT(_q_sort())); + connections = { + // view signals + QObjectPrivate::connect(q, &QTableWidget::pressed, + this, &QTableWidgetPrivate::_q_emitItemPressed), + QObjectPrivate::connect(q, &QTableWidget::clicked, + this, &QTableWidgetPrivate::_q_emitItemClicked), + QObjectPrivate::connect(q, &QTableWidget::doubleClicked, + this, &QTableWidgetPrivate::_q_emitItemDoubleClicked), + QObjectPrivate::connect(q, &QTableWidget::activated, + this, &QTableWidgetPrivate::_q_emitItemActivated), + QObjectPrivate::connect(q, &QTableWidget::entered, + this, &QTableWidgetPrivate::_q_emitItemEntered), + // model signals + QObjectPrivate::connect(model, &QAbstractItemModel::dataChanged, + this, &QTableWidgetPrivate::_q_emitItemChanged), + // selection signals + QObjectPrivate::connect(q->selectionModel(), &QItemSelectionModel::currentChanged, + this, &QTableWidgetPrivate::_q_emitCurrentItemChanged), + QObject::connect(q->selectionModel(), &QItemSelectionModel::selectionChanged, + q, &QTableWidget::itemSelectionChanged), + // sorting + QObjectPrivate::connect(model, &QAbstractItemModel::dataChanged, + this, &QTableWidgetPrivate::_q_dataChanged), + QObjectPrivate::connect(model, &QAbstractItemModel::columnsRemoved, + this, &QTableWidgetPrivate::_q_sort) + }; +} + +void QTableWidgetPrivate::clearConnections() +{ + for (const QMetaObject::Connection &connection : connections) + QObject::disconnect(connection); } void QTableWidgetPrivate::_q_emitItemPressed(const QModelIndex &index) @@ -1880,6 +1893,8 @@ QTableWidget::QTableWidget(int rows, int columns, QWidget *parent) */ QTableWidget::~QTableWidget() { + Q_D(QTableWidget); + d->clearConnections(); } /*! diff --git a/src/widgets/itemviews/qtablewidget_p.h b/src/widgets/itemviews/qtablewidget_p.h index 6bfa355edb..714aac6b7b 100644 --- a/src/widgets/itemviews/qtablewidget_p.h +++ b/src/widgets/itemviews/qtablewidget_p.h @@ -22,6 +22,8 @@ #include #include +#include + QT_REQUIRE_CONFIG(tablewidget); QT_BEGIN_NAMESPACE @@ -150,6 +152,7 @@ public: QTableWidgetPrivate() : QTableViewPrivate() {} inline QTableModel *tableModel() const { return qobject_cast(model); } void setup(); + void clearConnections(); // view signals void _q_emitItemPressed(const QModelIndex &index); @@ -164,6 +167,8 @@ public: // sorting void _q_sort(); void _q_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); + + std::array connections; }; class QTableWidgetItemPrivate