diff options
-rw-r--r-- | examples/widgets/itemviews/flattreeview/flattreeview.pro | 7 | ||||
-rw-r--r-- | examples/widgets/itemviews/flattreeview/main.cpp | 84 | ||||
-rw-r--r-- | examples/widgets/itemviews/itemviews.pro | 1 | ||||
-rw-r--r-- | src/widgets/itemviews/qheaderview.cpp | 45 | ||||
-rw-r--r-- | src/widgets/itemviews/qheaderview.h | 2 | ||||
-rw-r--r-- | src/widgets/itemviews/qheaderview_p.h | 4 | ||||
-rw-r--r-- | src/widgets/itemviews/qtableview.cpp | 4 | ||||
-rw-r--r-- | src/widgets/itemviews/qtreeview.cpp | 2 | ||||
-rw-r--r-- | tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp | 6 |
9 files changed, 146 insertions, 9 deletions
diff --git a/examples/widgets/itemviews/flattreeview/flattreeview.pro b/examples/widgets/itemviews/flattreeview/flattreeview.pro new file mode 100644 index 0000000000..05a6573d33 --- /dev/null +++ b/examples/widgets/itemviews/flattreeview/flattreeview.pro @@ -0,0 +1,7 @@ +QT += widgets + +SOURCES = main.cpp + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/widgets/itemviews/flattreeview +INSTALLS += target diff --git a/examples/widgets/itemviews/flattreeview/main.cpp b/examples/widgets/itemviews/flattreeview/main.cpp new file mode 100644 index 0000000000..e9bbb3fab1 --- /dev/null +++ b/examples/widgets/itemviews/flattreeview/main.cpp @@ -0,0 +1,84 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author David Faure <david.faure@kdab.com> +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/* + main.cpp + + A simple example that shows a multi-column list using QTreeView. + The data is not a tree, so the first column was made movable. +*/ + +#include <QApplication> +#include <QHeaderView> +#include <QStandardItemModel> +#include <QTreeView> + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + QStandardItemModel model(4, 2); + QTreeView treeView; + treeView.setModel(&model); + treeView.setRootIsDecorated(false); + treeView.header()->setFirstSectionMovable(true); + treeView.header()->setStretchLastSection(true); + + for (int row = 0; row < 4; ++row) { + for (int column = 0; column < 2; ++column) { + QModelIndex index = model.index(row, column, QModelIndex()); + model.setData(index, QVariant((row + 1) * (column + 1))); + } + } + + treeView.setWindowTitle(QObject::tr("Flat Tree View")); + treeView.show(); + return app.exec(); +} diff --git a/examples/widgets/itemviews/itemviews.pro b/examples/widgets/itemviews/itemviews.pro index 787217a8e8..75307bd74e 100644 --- a/examples/widgets/itemviews/itemviews.pro +++ b/examples/widgets/itemviews/itemviews.pro @@ -8,6 +8,7 @@ SUBDIRS = addressbook \ dirview \ editabletreemodel \ fetchmore \ + flattreeview \ frozencolumn \ interview \ pixelator \ 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() */ @@ -1163,6 +1171,39 @@ bool QHeaderView::sectionsMovable() const */ /*! + \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 If \a clickable is true, the header will respond to single clicks. 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); diff --git a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp index 273e90e110..8d90f9e59f 100644 --- a/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp +++ b/tests/auto/widgets/itemviews/qheaderview/tst_qheaderview.cpp @@ -514,6 +514,12 @@ void tst_QHeaderView::movable() QCOMPARE(view->sectionsMovable(), false); view->setSectionsMovable(true); QCOMPARE(view->sectionsMovable(), true); + + QCOMPARE(view->firstSectionMovable(), true); + view->setFirstSectionMovable(false); + QCOMPARE(view->firstSectionMovable(), false); + view->setFirstSectionMovable(true); + QCOMPARE(view->firstSectionMovable(), true); } void tst_QHeaderView::clickable() |