diff options
author | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2018-01-13 21:19:31 +0100 |
---|---|---|
committer | Christian Ehrlicher <ch.ehrlicher@gmx.de> | 2018-03-04 10:51:51 +0000 |
commit | 174a1e96350e8b128e856e97392a9b57c8c08ebb (patch) | |
tree | 9872a8d9e1206200539209ed7e964b804058c40b /src/widgets/itemviews/qheaderview.cpp | |
parent | 1f920b779eb308ecdfd24423941b229cd0123589 (diff) |
QHeaderView: make use of LayoutChangeHint in _q_sectionsChanged()
When _q_sectionsChanged() is called from e.g. QSortFilterProxyModel
the LayoutChangeHint is set which can be used to avoid useless work
in this function.
Change-Id: I034db3fcc7a5f9ea7ebc0fa3ffd7429edb154eb7
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src/widgets/itemviews/qheaderview.cpp')
-rw-r--r-- | src/widgets/itemviews/qheaderview.cpp | 66 |
1 files changed, 48 insertions, 18 deletions
diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index cd5961dc91..5cbf642802 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -361,9 +361,9 @@ void QHeaderView::setModel(QAbstractItemModel *model) QObject::disconnect(d->model, SIGNAL(columnsRemoved(QModelIndex,int,int)), this, SLOT(_q_sectionsRemoved(QModelIndex,int,int))); QObject::disconnect(d->model, SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_sectionsAboutToBeChanged())); + this, SLOT(_q_sectionsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int))); QObject::disconnect(d->model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_sectionsChanged())); + this, SLOT(_q_sectionsMoved(QModelIndex,int,int,QModelIndex,int))); } else { QObject::disconnect(d->model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(sectionsInserted(QModelIndex,int,int))); @@ -372,16 +372,16 @@ void QHeaderView::setModel(QAbstractItemModel *model) QObject::disconnect(d->model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(_q_sectionsRemoved(QModelIndex,int,int))); QObject::disconnect(d->model, SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_sectionsAboutToBeChanged())); + this, SLOT(_q_sectionsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int))); QObject::disconnect(d->model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_sectionsChanged())); + this, SLOT(_q_sectionsMoved(QModelIndex,int,int,QModelIndex,int))); } QObject::disconnect(d->model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), this, SLOT(headerDataChanged(Qt::Orientation,int,int))); - QObject::disconnect(d->model, SIGNAL(layoutAboutToBeChanged()), - this, SLOT(_q_sectionsAboutToBeChanged())); - QObject::disconnect(d->model, SIGNAL(layoutChanged()), - this, SLOT(_q_sectionsChanged())); + QObject::disconnect(d->model, SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)), + this, SLOT(_q_sectionsAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint))); + QObject::disconnect(d->model, SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)), + this, SLOT(_q_sectionsChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint))); } if (model && model != QAbstractItemModelPrivate::staticEmptyModel()) { @@ -393,9 +393,9 @@ void QHeaderView::setModel(QAbstractItemModel *model) QObject::connect(model, SIGNAL(columnsRemoved(QModelIndex,int,int)), this, SLOT(_q_sectionsRemoved(QModelIndex,int,int))); QObject::connect(model, SIGNAL(columnsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_sectionsAboutToBeChanged())); + this, SLOT(_q_sectionsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int))); QObject::connect(model, SIGNAL(columnsMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_sectionsChanged())); + this, SLOT(_q_sectionsMoved(QModelIndex,int,int,QModelIndex,int))); } else { QObject::connect(model, SIGNAL(rowsInserted(QModelIndex,int,int)), this, SLOT(sectionsInserted(QModelIndex,int,int))); @@ -404,16 +404,16 @@ void QHeaderView::setModel(QAbstractItemModel *model) QObject::connect(model, SIGNAL(rowsRemoved(QModelIndex,int,int)), this, SLOT(_q_sectionsRemoved(QModelIndex,int,int))); QObject::connect(model, SIGNAL(rowsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_sectionsAboutToBeChanged())); + this, SLOT(_q_sectionsAboutToBeMoved(QModelIndex,int,int,QModelIndex,int))); QObject::connect(model, SIGNAL(rowsMoved(QModelIndex,int,int,QModelIndex,int)), - this, SLOT(_q_sectionsChanged())); + this, SLOT(_q_sectionsMoved(QModelIndex,int,int,QModelIndex,int))); } QObject::connect(model, SIGNAL(headerDataChanged(Qt::Orientation,int,int)), this, SLOT(headerDataChanged(Qt::Orientation,int,int))); - QObject::connect(model, SIGNAL(layoutAboutToBeChanged()), - this, SLOT(_q_sectionsAboutToBeChanged())); - QObject::connect(model, SIGNAL(layoutChanged()), - this, SLOT(_q_sectionsChanged())); + QObject::connect(model, SIGNAL(layoutAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)), + this, SLOT(_q_sectionsAboutToBeChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint))); + QObject::connect(model, SIGNAL(layoutChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint)), + this, SLOT(_q_sectionsChanged(QList<QPersistentModelIndex>,QAbstractItemModel::LayoutChangeHint))); } d->state = QHeaderViewPrivate::NoClear; @@ -2150,8 +2150,33 @@ void QHeaderViewPrivate::_q_sectionsRemoved(const QModelIndex &parent, viewport->update(); } -void QHeaderViewPrivate::_q_sectionsAboutToBeChanged() +void QHeaderViewPrivate::_q_sectionsAboutToBeMoved(const QModelIndex &sourceParent, int logicalStart, int logicalEnd, const QModelIndex &destinationParent, int logicalDestination) { + if (sourceParent != root || destinationParent != root) + return; // we only handle changes in the root level + Q_UNUSED(logicalStart); + Q_UNUSED(logicalEnd); + Q_UNUSED(logicalDestination); + _q_sectionsAboutToBeChanged(); +} + +void QHeaderViewPrivate::_q_sectionsMoved(const QModelIndex &sourceParent, int logicalStart, int logicalEnd, const QModelIndex &destinationParent, int logicalDestination) +{ + if (sourceParent != root || destinationParent != root) + return; // we only handle changes in the root level + Q_UNUSED(logicalStart); + Q_UNUSED(logicalEnd); + Q_UNUSED(logicalDestination); + _q_sectionsChanged(); +} + +void QHeaderViewPrivate::_q_sectionsAboutToBeChanged(const QList<QPersistentModelIndex> &, + QAbstractItemModel::LayoutChangeHint hint) +{ + if ((hint == QAbstractItemModel::VerticalSortHint && orientation == Qt::Horizontal) || + (hint == QAbstractItemModel::HorizontalSortHint && orientation == Qt::Vertical)) + return; + //if there is no row/column we can't have mapping for columns //because no QModelIndex in the model would be valid // ### this is far from being bullet-proof and we would need a real system to @@ -2190,8 +2215,13 @@ void QHeaderViewPrivate::_q_sectionsAboutToBeChanged() } } -void QHeaderViewPrivate::_q_sectionsChanged() +void QHeaderViewPrivate::_q_sectionsChanged(const QList<QPersistentModelIndex> &, + QAbstractItemModel::LayoutChangeHint hint) { + if ((hint == QAbstractItemModel::VerticalSortHint && orientation == Qt::Horizontal) || + (hint == QAbstractItemModel::HorizontalSortHint && orientation == Qt::Vertical)) + return; + Q_Q(QHeaderView); viewport->update(); |