From 739611221c8346eb3800753f0acf354c42bf20a5 Mon Sep 17 00:00:00 2001 From: David Faure Date: Mon, 18 Dec 2017 10:19:51 +0100 Subject: Add QHeaderView::setFirstSectionMovable(), useful for flat treeviews MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QTreeView makes columns movable except for the first one (since Qt 5.0, see commit e0fc088c0c). This is indeed best for actual trees, but not when using QTreeView as a flat multi-column list (with no "root decoration"). Then it should be possible to move the first column. [ChangeLog][QtWidgets][QHeaderView] Flat treeviews can now allow the user to move the first column (like in Qt 4.x) using the new method QHeaderView::setFirstSectionMovable(). Change-Id: I6b5025e40850bf5c4c373124ee81f657f3f09d29 Reviewed-by: Thorbjørn Lund Martsum --- src/widgets/itemviews/qheaderview.cpp | 45 +++++++++++++++++++++++++++++++++-- src/widgets/itemviews/qheaderview.h | 2 ++ src/widgets/itemviews/qheaderview_p.h | 4 ---- src/widgets/itemviews/qtableview.cpp | 4 ++-- src/widgets/itemviews/qtreeview.cpp | 2 +- 5 files changed, 48 insertions(+), 9 deletions(-) (limited to 'src/widgets') diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index abd5997ea1..4c5d17ba69 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -1115,10 +1115,15 @@ int QHeaderView::logicalIndex(int visualIndex) const /*! \since 5.0 - If \a movable is true, the header may be moved by the user; otherwise it - is fixed in place. + If \a movable is true, the header sections may be moved by the user; + otherwise they are fixed in place. + + When used in combination with QTreeView, the first column is not + movable (since it contains the tree structure), by default. + You can make it movable with setFirstSectionMovable(true). \sa sectionsMovable(), sectionMoved() + \sa setFirstSectionMovable() */ void QHeaderView::setSectionsMovable(bool movable) @@ -1143,6 +1148,9 @@ void QHeaderView::setSectionsMovable(bool movable) Returns \c true if the header can be moved by the user; otherwise returns false. + By default, sections are movable in QTreeView (except for the first one), + and not movable in QTableView. + \sa setSectionsMovable() */ @@ -1162,6 +1170,39 @@ bool QHeaderView::sectionsMovable() const \sa sectionsMovable() */ +/*! + \since 5.10 + + If \a movable is true, the first column can be moved by the user. + In a QTreeView, the first column holds the tree structure and is + therefore non-movable by default, even after setSectionsMovable(true). + + It can be made movable again, for instance in the case of flat lists + without a tree structure, by calling this method. + In such a scenario, it is recommended to call QTreeView::setRootIsDecorated(false) + as well. + + This method has no effect unless setSectionsMovable(true) is called as well. + \sa setSectionsMovable() +*/ +void QHeaderView::setFirstSectionMovable(bool movable) +{ + Q_D(QHeaderView); + d->allowUserMoveOfSection0 = movable; +} + +/*! + \since 5.10 + + Returns \c true if the first column can be moved by the user, + when this header is used in a QTreeView. +*/ +bool QHeaderView::firstSectionMovable() const +{ + Q_D(const QHeaderView); + return d->allowUserMoveOfSection0; +} + /*! \since 5.0 diff --git a/src/widgets/itemviews/qheaderview.h b/src/widgets/itemviews/qheaderview.h index ec00d16d10..cfe2d24453 100644 --- a/src/widgets/itemviews/qheaderview.h +++ b/src/widgets/itemviews/qheaderview.h @@ -118,6 +118,8 @@ public: inline QT_DEPRECATED void setMovable(bool movable) { setSectionsMovable(movable); } inline QT_DEPRECATED bool isMovable() const { return sectionsMovable(); } #endif + void setFirstSectionMovable(bool movable); + bool firstSectionMovable() const; void setSectionsClickable(bool clickable); bool sectionsClickable() const; diff --git a/src/widgets/itemviews/qheaderview_p.h b/src/widgets/itemviews/qheaderview_p.h index 3b8e61af75..d844274618 100644 --- a/src/widgets/itemviews/qheaderview_p.h +++ b/src/widgets/itemviews/qheaderview_p.h @@ -246,10 +246,6 @@ public: } } - inline void setAllowUserMoveOfSection0(bool b) { - allowUserMoveOfSection0 = b; - } - void clear(); void flipSortIndicator(int section); void cascadingResize(int visual, int newSize); diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp index fd3bdfd065..3b0a738d38 100644 --- a/src/widgets/itemviews/qtableview.cpp +++ b/src/widgets/itemviews/qtableview.cpp @@ -1226,7 +1226,7 @@ void QTableView::setHorizontalHeader(QHeaderView *header) delete d->horizontalHeader; d->horizontalHeader = header; d->horizontalHeader->setParent(this); - d->horizontalHeader->d_func()->setAllowUserMoveOfSection0(true); + d->horizontalHeader->setFirstSectionMovable(true); if (!d->horizontalHeader->model()) { d->horizontalHeader->setModel(d->model); if (d->selectionModel) @@ -1264,7 +1264,7 @@ void QTableView::setVerticalHeader(QHeaderView *header) delete d->verticalHeader; d->verticalHeader = header; d->verticalHeader->setParent(this); - d->verticalHeader->d_func()->setAllowUserMoveOfSection0(true); + d->verticalHeader->setFirstSectionMovable(true); if (!d->verticalHeader->model()) { d->verticalHeader->setModel(d->model); if (d->selectionModel) diff --git a/src/widgets/itemviews/qtreeview.cpp b/src/widgets/itemviews/qtreeview.cpp index 6ea180dcf2..e1cb16db8a 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -311,7 +311,7 @@ void QTreeView::setHeader(QHeaderView *header) delete d->header; d->header = header; d->header->setParent(this); - d->header->d_func()->setAllowUserMoveOfSection0(false); + d->header->setFirstSectionMovable(false); if (!d->header->model()) { d->header->setModel(d->model); -- cgit v1.2.3