diff options
Diffstat (limited to 'src/widgets/itemviews/qcolumnview.cpp')
-rw-r--r-- | src/widgets/itemviews/qcolumnview.cpp | 82 |
1 files changed, 58 insertions, 24 deletions
diff --git a/src/widgets/itemviews/qcolumnview.cpp b/src/widgets/itemviews/qcolumnview.cpp index 040bddb311..04bc8f5f88 100644 --- a/src/widgets/itemviews/qcolumnview.cpp +++ b/src/widgets/itemviews/qcolumnview.cpp @@ -68,7 +68,9 @@ void QColumnViewPrivate::initialize() Q_Q(QColumnView); q->setTextElideMode(Qt::ElideMiddle); #if QT_CONFIG(animation) - QObject::connect(¤tAnimation, SIGNAL(finished()), q, SLOT(_q_changeCurrentColumn())); + animationConnection = + QObjectPrivate::connect(¤tAnimation, &QPropertyAnimation::finished, + this, &QColumnViewPrivate::changeCurrentColumn); currentAnimation.setTargetObject(hbar); currentAnimation.setPropertyName("value"); currentAnimation.setEasingCurve(QEasingCurve::InOutQuad); @@ -77,11 +79,26 @@ void QColumnViewPrivate::initialize() q->setItemDelegate(new QColumnViewDelegate(q)); } +void QColumnViewPrivate::clearConnections() +{ +#if QT_CONFIG(animation) + QObject::disconnect(animationConnection); +#endif + for (const QMetaObject::Connection &connection : gripConnections) + QObject::disconnect(connection); + const auto copy = viewConnections; // disconnectView modifies this container + for (auto it = copy.keyBegin(); it != copy.keyEnd(); ++it) + disconnectView(*it); +} + + /*! Destroys the column view. */ QColumnView::~QColumnView() { + Q_D(QColumnView); + d->clearConnections(); } /*! @@ -98,12 +115,15 @@ void QColumnView::setResizeGripsVisible(bool visible) if (d->showResizeGrips == visible) return; d->showResizeGrips = visible; - for (int i = 0; i < d->columns.size(); ++i) { - QAbstractItemView *view = d->columns[i]; + d->gripConnections.clear(); + for (QAbstractItemView *view : std::as_const(d->columns)) { if (visible) { QColumnViewGrip *grip = new QColumnViewGrip(view); view->setCornerWidget(grip); - connect(grip, SIGNAL(gripMoved(int)), this, SLOT(_q_gripMoved(int))); + d->gripConnections.push_back( + QObjectPrivate::connect(grip, &QColumnViewGrip::gripMoved, + d, &QColumnViewPrivate::gripMoved) + ); } else { QWidget *widget = view->cornerWidget(); view->setCornerWidget(nullptr); @@ -267,7 +287,7 @@ void QColumnView::scrollTo(const QModelIndex &index, ScrollHint hint) if (leftEdge > -horizontalOffset() && rightEdge <= ( -horizontalOffset() + viewport()->size().width())) { d->columns.at(indexColumn)->scrollTo(index); - d->_q_changeCurrentColumn(); + d->changeCurrentColumn(); return; } @@ -486,7 +506,7 @@ QSize QColumnView::sizeHint() const \internal Move all widgets from the corner grip and to the right */ -void QColumnViewPrivate::_q_gripMoved(int offset) +void QColumnViewPrivate::gripMoved(int offset) { Q_Q(QColumnView); @@ -578,8 +598,10 @@ void QColumnViewPrivate::closeColumns(const QModelIndex &parent, bool build) QAbstractItemView* notShownAnymore = columns.at(i); columns.removeAt(i); notShownAnymore->setVisible(false); - if (notShownAnymore != previewColumn) + if (notShownAnymore != previewColumn) { notShownAnymore->deleteLater(); + disconnectView(notShownAnymore); + } } if (columns.isEmpty()) { @@ -598,7 +620,17 @@ void QColumnViewPrivate::closeColumns(const QModelIndex &parent, bool build) createColumn(parent, false); } -void QColumnViewPrivate::_q_clicked(const QModelIndex &index) +void QColumnViewPrivate::disconnectView(QAbstractItemView *view) +{ + const auto it = viewConnections.find(view); + if (it == viewConnections.end()) + return; + for (const QMetaObject::Connection &connection : it.value()) + QObject::disconnect(connection); + viewConnections.erase(it); +} + +void QColumnViewPrivate::clicked(const QModelIndex &index) { Q_Q(QColumnView); QModelIndex parent = index.parent(); @@ -631,10 +663,11 @@ QAbstractItemView *QColumnViewPrivate::createColumn(const QModelIndex &index, bo { Q_Q(QColumnView); QAbstractItemView *view = nullptr; + QMetaObject::Connection clickedConnection; if (model->hasChildren(index)) { view = q->createColumn(index); - q->connect(view, SIGNAL(clicked(QModelIndex)), - q, SLOT(_q_clicked(QModelIndex))); + clickedConnection = QObjectPrivate::connect(view, &QAbstractItemView::clicked, + this, &QColumnViewPrivate::clicked); } else { if (!previewColumn) setPreviewWidget(new QWidget(q)); @@ -642,16 +675,14 @@ QAbstractItemView *QColumnViewPrivate::createColumn(const QModelIndex &index, bo view->setMinimumWidth(qMax(view->minimumWidth(), previewWidget->minimumWidth())); } - q->connect(view, SIGNAL(activated(QModelIndex)), - q, SIGNAL(activated(QModelIndex))); - q->connect(view, SIGNAL(clicked(QModelIndex)), - q, SIGNAL(clicked(QModelIndex))); - q->connect(view, SIGNAL(doubleClicked(QModelIndex)), - q, SIGNAL(doubleClicked(QModelIndex))); - q->connect(view, SIGNAL(entered(QModelIndex)), - q, SIGNAL(entered(QModelIndex))); - q->connect(view, SIGNAL(pressed(QModelIndex)), - q, SIGNAL(pressed(QModelIndex))); + viewConnections[view] = { + QObject::connect(view, &QAbstractItemView::activated, q, &QColumnView::activated), + QObject::connect(view, &QAbstractItemView::clicked, q, &QColumnView::clicked), + QObject::connect(view, &QAbstractItemView::doubleClicked, q, &QColumnView::doubleClicked), + QObject::connect(view, &QAbstractItemView::entered, q, &QColumnView::entered), + QObject::connect(view, &QAbstractItemView::pressed, q, &QColumnView::pressed), + clickedConnection + }; view->setFocusPolicy(Qt::NoFocus); view->setParent(viewport); @@ -661,7 +692,10 @@ QAbstractItemView *QColumnViewPrivate::createColumn(const QModelIndex &index, bo if (showResizeGrips) { QColumnViewGrip *grip = new QColumnViewGrip(view); view->setCornerWidget(grip); - q->connect(grip, SIGNAL(gripMoved(int)), q, SLOT(_q_gripMoved(int))); + gripConnections.push_back( + QObjectPrivate::connect(grip, &QColumnViewGrip::gripMoved, + this, &QColumnViewPrivate::gripMoved) + ); } if (columnSizes.size() > columns.size()) { @@ -915,7 +949,7 @@ void QColumnView::currentChanged(const QModelIndex ¤t, const QModelIndex & We have change the current column and need to update focus and selection models on the new current column. */ -void QColumnViewPrivate::_q_changeCurrentColumn() +void QColumnViewPrivate::changeCurrentColumn() { Q_Q(QColumnView); if (columns.isEmpty()) @@ -1022,9 +1056,9 @@ QColumnViewPrivate::~QColumnViewPrivate() \internal */ -void QColumnViewPrivate::_q_columnsInserted(const QModelIndex &parent, int start, int end) +void QColumnViewPrivate::columnsInserted(const QModelIndex &parent, int start, int end) { - QAbstractItemViewPrivate::_q_columnsInserted(parent, start, end); + QAbstractItemViewPrivate::columnsInserted(parent, start, end); checkColumnCreation(parent); } |