diff options
Diffstat (limited to 'src/widgets/itemviews/qcolumnview.cpp')
-rw-r--r-- | src/widgets/itemviews/qcolumnview.cpp | 110 |
1 files changed, 72 insertions, 38 deletions
diff --git a/src/widgets/itemviews/qcolumnview.cpp b/src/widgets/itemviews/qcolumnview.cpp index 73748d3af4..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.count(); ++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); @@ -140,7 +160,7 @@ void QColumnView::setRootIndex(const QModelIndex &index) return; d->closeColumns(); - Q_ASSERT(d->columns.count() == 0); + Q_ASSERT(d->columns.size() == 0); QAbstractItemView *view = d->createColumn(index, true); if (view->selectionModel()) @@ -206,7 +226,7 @@ void QColumnView::scrollContentsBy(int dx, int dy) return; dx = isRightToLeft() ? -dx : dx; - for (int i = 0; i < d->columns.count(); ++i) + for (int i = 0; i < d->columns.size(); ++i) d->columns.at(i)->move(d->columns.at(i)->x() + dx, 0); d->offset += dx; QAbstractItemView::scrollContentsBy(dx, dy); @@ -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; } @@ -420,7 +440,7 @@ int QColumnView::verticalOffset() const */ QRegion QColumnView::visualRegionForSelection(const QItemSelection &selection) const { - int ranges = selection.count(); + int ranges = selection.size(); if (ranges == 0) return QRect(); @@ -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,12 +620,22 @@ 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(); QAbstractItemView *columnClicked = nullptr; - for (int column = 0; column < columns.count(); ++column) { + for (int column = 0; column < columns.size(); ++column) { if (columns.at(column)->rootIndex() == parent) { columnClicked = columns[column]; break; @@ -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,19 +692,22 @@ 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.count() > columns.count()) { - view->setGeometry(0, 0, columnSizes.at(columns.count()), viewport->height()); + if (columnSizes.size() > columns.size()) { + view->setGeometry(0, 0, columnSizes.at(columns.size()), viewport->height()); } else { int initialWidth = view->sizeHint().width(); if (q->isRightToLeft()) view->setGeometry(viewport->width() - initialWidth, 0, initialWidth, viewport->height()); else view->setGeometry(0, 0, initialWidth, viewport->height()); - columnSizes.resize(qMax(columnSizes.count(), columns.count() + 1)); - columnSizes[columns.count()] = initialWidth; + columnSizes.resize(qMax(columnSizes.size(), columns.size() + 1)); + columnSizes[columns.size()] = initialWidth; } if (!columns.isEmpty() && columns.constLast()->isHidden()) columns.constLast()->setVisible(true); @@ -826,8 +860,8 @@ void QColumnView::setColumnWidths(const QList<int> &list) { Q_D(QColumnView); int i = 0; - const int listCount = list.count(); - const int count = qMin(listCount, d->columns.count()); + const int listCount = list.size(); + const int count = qMin(listCount, d->columns.size()); for (; i < count; ++i) { d->columns.at(i)->resize(list.at(i), d->columns.at(i)->height()); d->columnSizes[i] = list.at(i); @@ -847,7 +881,7 @@ QList<int> QColumnView::columnWidths() const { Q_D(const QColumnView); QList<int> list; - const int columnCount = d->columns.count(); + const int columnCount = d->columns.size(); list.reserve(columnCount); for (int i = 0; i < columnCount; ++i) list.append(d->columnSizes.at(i)); @@ -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()) @@ -984,9 +1018,9 @@ void QColumnView::selectAll() QModelIndexList indexList = selectionModel()->selectedIndexes(); QModelIndex parent = rootIndex(); QItemSelection selection; - if (indexList.count() >= 1) + if (indexList.size() >= 1) parent = indexList.at(0).parent(); - if (indexList.count() == 1) { + if (indexList.size() == 1) { parent = indexList.at(0); if (!model()->hasChildren(parent)) parent = parent.parent(); @@ -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); } @@ -1039,7 +1073,7 @@ void QColumnViewPrivate::checkColumnCreation(const QModelIndex &parent) if (parent == q_func()->currentIndex() && model->hasChildren(parent)) { //the parent has children and is the current //let's try to find out if there is already a mapping that is good - for (int i = 0; i < columns.count(); ++i) { + for (int i = 0; i < columns.size(); ++i) { QAbstractItemView *view = columns.at(i); if (view->rootIndex() == parent) { if (view == previewColumn) { |