diff options
author | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2023-09-24 19:37:06 +0200 |
---|---|---|
committer | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2023-09-29 20:07:10 +0200 |
commit | a126d3627cc347500c1a6bd82027efa6d451ccbd (patch) | |
tree | 33055c9aa071909626aeb23f15d28cb96cb71d9a | |
parent | b289d669a5025c7969ee35f2ee0d4284d173dec5 (diff) |
Widgets/Itemviews: use pmf-style connect in QAbstractItemView
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().
Change-Id: I8f2d64b77849bf5fea01b7f80bbd5d0c0a09c4fa
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
-rw-r--r-- | src/widgets/itemviews/qabstractitemview.cpp | 241 | ||||
-rw-r--r-- | src/widgets/itemviews/qabstractitemview_p.h | 15 |
2 files changed, 143 insertions, 113 deletions
diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index 5c2e59915f..36f03e996e 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -104,15 +104,16 @@ void QAbstractItemViewPrivate::init() vbar->setRange(0, 0); hbar->setRange(0, 0); - QObject::connect(vbar, SIGNAL(actionTriggered(int)), - q, SLOT(verticalScrollbarAction(int))); - QObject::connect(hbar, SIGNAL(actionTriggered(int)), - q, SLOT(horizontalScrollbarAction(int))); - QObject::connect(vbar, SIGNAL(valueChanged(int)), - q, SLOT(verticalScrollbarValueChanged(int))); - QObject::connect(hbar, SIGNAL(valueChanged(int)), - q, SLOT(horizontalScrollbarValueChanged(int))); - + scrollbarConnections = { + QObject::connect(vbar, &QScrollBar::actionTriggered, + q, &QAbstractItemView::verticalScrollbarAction), + QObject::connect(hbar, &QScrollBar::actionTriggered, + q, &QAbstractItemView::horizontalScrollbarAction), + QObject::connect(vbar, &QScrollBar::valueChanged, + q, &QAbstractItemView::verticalScrollbarValueChanged), + QObject::connect(hbar, &QScrollBar::valueChanged, + q, &QAbstractItemView::horizontalScrollbarValueChanged) + }; viewport->setBackgroundRole(QPalette::Base); q->setAttribute(Qt::WA_InputMethodEnabled); @@ -220,6 +221,63 @@ void QAbstractItemViewPrivate::_q_delegateSizeHintChanged(const QModelIndex &ind QMetaObject::invokeMethod(q, &QAbstractItemView::doItemsLayout, Qt::QueuedConnection); } +void QAbstractItemViewPrivate::connectDelegate(QAbstractItemDelegate *delegate) +{ + if (!delegate) + return; + Q_Q(QAbstractItemView); + QObject::connect(delegate, &QAbstractItemDelegate::closeEditor, + q, &QAbstractItemView::closeEditor); + QObject::connect(delegate, &QAbstractItemDelegate::commitData, + q, &QAbstractItemView::commitData); + QObjectPrivate::connect(delegate, &QAbstractItemDelegate::sizeHintChanged, + this, &QAbstractItemViewPrivate::_q_delegateSizeHintChanged); +} + +void QAbstractItemViewPrivate::disconnectDelegate(QAbstractItemDelegate *delegate) +{ + if (!delegate) + return; + Q_Q(QAbstractItemView); + QObject::disconnect(delegate, &QAbstractItemDelegate::closeEditor, + q, &QAbstractItemView::closeEditor); + QObject::disconnect(delegate, &QAbstractItemDelegate::commitData, + q, &QAbstractItemView::commitData); + QObjectPrivate::disconnect(delegate, &QAbstractItemDelegate::sizeHintChanged, + this, &QAbstractItemViewPrivate::_q_delegateSizeHintChanged); +} + +void QAbstractItemViewPrivate::disconnectAll() +{ + Q_Q(QAbstractItemView); + for (const QMetaObject::Connection &connection : modelConnections) + QObject::disconnect(connection); + for (const QMetaObject::Connection &connection : scrollbarConnections) + QObject::disconnect(connection); + disconnectDelegate(itemDelegate); + for (QAbstractItemDelegate *delegate : std::as_const(rowDelegates)) + disconnectDelegate(delegate); + for (QAbstractItemDelegate *delegate : std::as_const(columnDelegates)) + disconnectDelegate(delegate); + if (model && selectionModel) { + QObject::disconnect(model, &QAbstractItemModel::destroyed, + selectionModel, &QItemSelectionModel::deleteLater); + } + if (selectionModel) { + QObject::disconnect(selectionModel, &QItemSelectionModel::selectionChanged, + q, &QAbstractItemView::selectionChanged); + QObject::disconnect(selectionModel, &QItemSelectionModel::currentChanged, + q, &QAbstractItemView::currentChanged); + } + for (const auto &info : std::as_const(indexEditorHash)) { + if (!info.isStatic && info.widget) + QObject::disconnect(info.widget, &QWidget::destroyed, q, &QAbstractItemView::editorDestroyed); + } +#if QT_CONFIG(gestures) && QT_CONFIG(scroller) + QObject::disconnect(scollerConnection); +#endif +} + /*! \class QAbstractItemView @@ -633,6 +691,7 @@ QAbstractItemView::~QAbstractItemView() d->autoScrollTimer.stop(); d->delayedLayout.stop(); d->fetchMoreTimer.stop(); + d->disconnectAll(); } /*! @@ -661,68 +720,47 @@ void QAbstractItemView::setModel(QAbstractItemModel *model) if (model == d->model) return; if (d->model && d->model != QAbstractItemModelPrivate::staticEmptyModel()) { - disconnect(d->model, SIGNAL(destroyed()), - this, SLOT(_q_modelDestroyed())); - disconnect(d->model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QList<int>)), this, - SLOT(dataChanged(QModelIndex,QModelIndex,QList<int>))); - disconnect(d->model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), - this, SLOT(_q_headerDataChanged())); - disconnect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), - this, SLOT(rowsInserted(QModelIndex,int,int))); - disconnect(d->model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), - this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int))); - disconnect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)), - this, SLOT(_q_rowsRemoved(QModelIndex,int,int))); - disconnect(d->model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int))); - disconnect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), - this, SLOT(_q_rowsInserted(QModelIndex,int,int))); - disconnect(d->model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)), - this, SLOT(_q_columnsAboutToBeRemoved(QModelIndex,int,int))); - disconnect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)), - this, SLOT(_q_columnsRemoved(QModelIndex,int,int))); - disconnect(d->model, SIGNAL(columnsInserted(QModelIndex,int,int)), - this, SLOT(_q_columnsInserted(QModelIndex,int,int))); - disconnect(d->model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_columnsMoved(QModelIndex,int,int,QModelIndex,int))); - - disconnect(d->model, SIGNAL(modelReset()), this, SLOT(reset())); - disconnect(d->model, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged())); + for (const QMetaObject::Connection &connection : d->modelConnections) + disconnect(connection); } d->model = (model ? model : QAbstractItemModelPrivate::staticEmptyModel()); if (d->model != QAbstractItemModelPrivate::staticEmptyModel()) { - connect(d->model, SIGNAL(destroyed()), - this, SLOT(_q_modelDestroyed())); - connect(d->model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QList<int>)), this, - SLOT(dataChanged(QModelIndex,QModelIndex,QList<int>))); - connect(d->model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), - this, SLOT(_q_headerDataChanged())); - connect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), - this, SLOT(rowsInserted(QModelIndex,int,int))); - connect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), - this, SLOT(_q_rowsInserted(QModelIndex,int,int))); - connect(d->model, SIGNAL(rowsAboutToBeRemoved(QModelIndex,int,int)), - this, SLOT(rowsAboutToBeRemoved(QModelIndex,int,int))); - connect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)), - this, SLOT(_q_rowsRemoved(QModelIndex,int,int))); - connect(d->model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_rowsMoved(QModelIndex,int,int,QModelIndex,int))); - connect(d->model, SIGNAL(columnsAboutToBeRemoved(QModelIndex,int,int)), - this, SLOT(_q_columnsAboutToBeRemoved(QModelIndex,int,int))); - connect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)), - this, SLOT(_q_columnsRemoved(QModelIndex,int,int))); - connect(d->model, SIGNAL(columnsInserted(QModelIndex,int,int)), - this, SLOT(_q_columnsInserted(QModelIndex,int,int))); - connect(d->model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_columnsMoved(QModelIndex,int,int,QModelIndex,int))); - - connect(d->model, SIGNAL(modelReset()), this, SLOT(reset())); - connect(d->model, SIGNAL(layoutChanged()), this, SLOT(_q_layoutChanged())); + d->modelConnections = { + QObjectPrivate::connect(d->model, &QAbstractItemModel::destroyed, + d, &QAbstractItemViewPrivate::_q_modelDestroyed), + QObject::connect(d->model, &QAbstractItemModel::dataChanged, + this, &QAbstractItemView::dataChanged), + QObjectPrivate::connect(d->model, &QAbstractItemModel::headerDataChanged, + d, &QAbstractItemViewPrivate::_q_headerDataChanged), + QObject::connect(d->model, &QAbstractItemModel::rowsInserted, + this, &QAbstractItemView::rowsInserted), + QObjectPrivate::connect(d->model, &QAbstractItemModel::rowsInserted, + d, &QAbstractItemViewPrivate::_q_rowsInserted), + QObject::connect(d->model, &QAbstractItemModel::rowsAboutToBeRemoved, + this, &QAbstractItemView::rowsAboutToBeRemoved), + QObjectPrivate::connect(d->model, &QAbstractItemModel::rowsRemoved, + d, &QAbstractItemViewPrivate::_q_rowsRemoved), + QObjectPrivate::connect(d->model, &QAbstractItemModel::rowsMoved, + d, &QAbstractItemViewPrivate::_q_rowsMoved), + QObjectPrivate::connect(d->model, &QAbstractItemModel::columnsAboutToBeRemoved, + d, &QAbstractItemViewPrivate::_q_columnsAboutToBeRemoved), + QObjectPrivate::connect(d->model, &QAbstractItemModel::columnsRemoved, + d, &QAbstractItemViewPrivate::_q_columnsRemoved), + QObjectPrivate::connect(d->model, &QAbstractItemModel::columnsInserted, + d, &QAbstractItemViewPrivate::_q_columnsInserted), + QObjectPrivate::connect(d->model, &QAbstractItemModel::columnsMoved, + d, &QAbstractItemViewPrivate::_q_columnsMoved), + QObject::connect(d->model, &QAbstractItemModel::modelReset, + this, &QAbstractItemView::reset), + QObjectPrivate::connect(d->model, &QAbstractItemModel::layoutChanged, + d, &QAbstractItemViewPrivate::_q_layoutChanged), + }; } QItemSelectionModel *selection_model = new QItemSelectionModel(d->model, this); - connect(d->model, SIGNAL(destroyed()), selection_model, SLOT(deleteLater())); + connect(d->model, &QAbstractItemModel::destroyed, + selection_model, &QItemSelectionModel::deleteLater); setSelectionModel(selection_model); reset(); // kill editors, set new root and do layout @@ -772,20 +810,19 @@ void QAbstractItemView::setSelectionModel(QItemSelectionModel *selectionModel) oldSelection = d->selectionModel->selection(); oldCurrentIndex = d->selectionModel->currentIndex(); } - - disconnect(d->selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), - this, SLOT(selectionChanged(QItemSelection,QItemSelection))); - disconnect(d->selectionModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)), - this, SLOT(currentChanged(QModelIndex,QModelIndex))); + disconnect(d->selectionModel, &QItemSelectionModel::selectionChanged, + this, &QAbstractItemView::selectionChanged); + disconnect(d->selectionModel, &QItemSelectionModel::currentChanged, + this, &QAbstractItemView::currentChanged); } d->selectionModel = selectionModel; if (d->selectionModel) { - connect(d->selectionModel, SIGNAL(selectionChanged(QItemSelection,QItemSelection)), - this, SLOT(selectionChanged(QItemSelection,QItemSelection))); - connect(d->selectionModel, SIGNAL(currentChanged(QModelIndex,QModelIndex)), - this, SLOT(currentChanged(QModelIndex,QModelIndex))); + connect(d->selectionModel, &QItemSelectionModel::selectionChanged, + this, &QAbstractItemView::selectionChanged); + connect(d->selectionModel, &QItemSelectionModel::currentChanged, + this, &QAbstractItemView::currentChanged); selectionChanged(d->selectionModel->selection(), oldSelection); currentChanged(d->selectionModel->currentIndex(), oldCurrentIndex); @@ -825,21 +862,13 @@ void QAbstractItemView::setItemDelegate(QAbstractItemDelegate *delegate) return; if (d->itemDelegate) { - if (d->delegateRefCount(d->itemDelegate) == 1) { - disconnect(d->itemDelegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), - this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); - disconnect(d->itemDelegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); - disconnect(d->itemDelegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(_q_delegateSizeHintChanged(QModelIndex))); - } + if (d->delegateRefCount(d->itemDelegate) == 1) + d->disconnectDelegate(delegate); } if (delegate) { - if (d->delegateRefCount(delegate) == 0) { - connect(delegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), - this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); - connect(delegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); - connect(delegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(_q_delegateSizeHintChanged(QModelIndex))); - } + if (d->delegateRefCount(delegate) == 0) + d->connectDelegate(delegate); } d->itemDelegate = delegate; viewport()->update(); @@ -909,21 +938,13 @@ void QAbstractItemView::setItemDelegateForRow(int row, QAbstractItemDelegate *de { Q_D(QAbstractItemView); if (QAbstractItemDelegate *rowDelegate = d->rowDelegates.value(row, nullptr)) { - if (d->delegateRefCount(rowDelegate) == 1) { - disconnect(rowDelegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), - this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); - disconnect(rowDelegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); - disconnect(rowDelegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(_q_delegateSizeHintChanged(QModelIndex))); - } + if (d->delegateRefCount(rowDelegate) == 1) + d->disconnectDelegate(rowDelegate); d->rowDelegates.remove(row); } if (delegate) { - if (d->delegateRefCount(delegate) == 0) { - connect(delegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), - this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); - connect(delegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); - connect(delegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(_q_delegateSizeHintChanged(QModelIndex))); - } + if (d->delegateRefCount(delegate) == 0) + d->connectDelegate(delegate); d->rowDelegates.insert(row, delegate); } viewport()->update(); @@ -969,21 +990,13 @@ void QAbstractItemView::setItemDelegateForColumn(int column, QAbstractItemDelega { Q_D(QAbstractItemView); if (QAbstractItemDelegate *columnDelegate = d->columnDelegates.value(column, nullptr)) { - if (d->delegateRefCount(columnDelegate) == 1) { - disconnect(columnDelegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), - this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); - disconnect(columnDelegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); - disconnect(columnDelegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(_q_delegateSizeHintChanged(QModelIndex))); - } + if (d->delegateRefCount(columnDelegate) == 1) + d->disconnectDelegate(columnDelegate); d->columnDelegates.remove(column); } if (delegate) { - if (d->delegateRefCount(delegate) == 0) { - connect(delegate, SIGNAL(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint)), - this, SLOT(closeEditor(QWidget*,QAbstractItemDelegate::EndEditHint))); - connect(delegate, SIGNAL(commitData(QWidget*)), this, SLOT(commitData(QWidget*))); - connect(delegate, SIGNAL(sizeHintChanged(QModelIndex)), this, SLOT(_q_delegateSizeHintChanged(QModelIndex))); - } + if (d->delegateRefCount(delegate) == 0) + d->connectDelegate(delegate); d->columnDelegates.insert(column, delegate); } viewport()->update(); @@ -1774,7 +1787,10 @@ bool QAbstractItemView::viewportEvent(QEvent *event) case QEvent::ScrollPrepare: executeDelayedItemsLayout(); #if QT_CONFIG(gestures) && QT_CONFIG(scroller) - connect(QScroller::scroller(d->viewport), SIGNAL(stateChanged(QScroller::State)), this, SLOT(_q_scrollerStateChanged()), Qt::UniqueConnection); + d->scollerConnection = QObjectPrivate::connect( + QScroller::scroller(d->viewport), &QScroller::stateChanged, + d, &QAbstractItemViewPrivate::_q_scrollerStateChanged, + Qt::UniqueConnection); #endif break; @@ -4435,7 +4451,7 @@ QWidget *QAbstractItemViewPrivate::editor(const QModelIndex &index, w = delegate->createEditor(viewport, options, index); if (w) { w->installEventFilter(delegate); - QObject::connect(w, SIGNAL(destroyed(QObject*)), q, SLOT(editorDestroyed(QObject*))); + QObject::connect(w, &QWidget::destroyed, q, &QAbstractItemView::editorDestroyed); delegate->updateEditorGeometry(w, options, index); delegate->setEditorData(w, index); addEditor(index, w, false); @@ -4572,6 +4588,9 @@ QModelIndex QAbstractItemViewPrivate::indexForEditor(QWidget *editor) const void QAbstractItemViewPrivate::removeEditor(QWidget *editor) { + Q_Q(QAbstractItemView); + if (editor) + QObject::disconnect(editor, &QWidget::destroyed, q, &QAbstractItemView::editorDestroyed); const auto it = editorIndexHash.constFind(editor); if (it != editorIndexHash.cend()) { indexEditorHash.remove(it.value()); diff --git a/src/widgets/itemviews/qabstractitemview_p.h b/src/widgets/itemviews/qabstractitemview_p.h index 7852a8a227..852ceb6ab2 100644 --- a/src/widgets/itemviews/qabstractitemview_p.h +++ b/src/widgets/itemviews/qabstractitemview_p.h @@ -28,6 +28,8 @@ #include "QtCore/qbasictimer.h" #include "QtCore/qelapsedtimer.h" +#include <array> + QT_REQUIRE_CONFIG(itemviews); QT_BEGIN_NAMESPACE @@ -178,8 +180,8 @@ public: inline void releaseEditor(QWidget *editor, const QModelIndex &index = QModelIndex()) const { if (editor) { Q_Q(const QAbstractItemView); - QObject::disconnect(editor, SIGNAL(destroyed(QObject*)), - q_func(), SLOT(editorDestroyed(QObject*))); + QObject::disconnect(editor, &QWidget::destroyed, + q, &QAbstractItemView::editorDestroyed); editor->removeEventFilter(itemDelegate); editor->hide(); QAbstractItemDelegate *delegate = q->itemDelegateForIndex(index); @@ -418,7 +420,16 @@ public: virtual QRect visualRect(const QModelIndex &index) const { return q_func()->visualRect(index); } + std::array<QMetaObject::Connection, 14> modelConnections; + std::array<QMetaObject::Connection, 4> scrollbarConnections; +#if QT_CONFIG(gestures) && QT_CONFIG(scroller) + QMetaObject::Connection scollerConnection; +#endif + private: + void connectDelegate(QAbstractItemDelegate *delegate); + void disconnectDelegate(QAbstractItemDelegate *delegate); + void disconnectAll(); inline QAbstractItemDelegate *delegateForIndex(const QModelIndex &index) const { QMap<int, QPointer<QAbstractItemDelegate> >::ConstIterator it; |