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 <axel.spoerl@qt.io>
bb10
Christian Ehrlicher 2023-09-24 19:41:42 +02:00
parent 0bb35ee2f0
commit c55a7e4167
2 changed files with 40 additions and 24 deletions

View File

@ -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();
}
/*

View File

@ -23,6 +23,8 @@
#include <private/qtreeview_p.h>
#include <QtWidgets/qheaderview.h>
#include <array>
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<QTreeModel*>(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<QMetaObject::Connection, 12> connections;
};
QT_END_NAMESPACE