diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index 541d40d421e..fa774b50741 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -2268,7 +2268,12 @@ void QHeaderView::mousePressEvent(QMouseEvent *e) d->pressed = logicalIndexAt(pos); if (d->clickableSections) emit sectionPressed(d->pressed); - if (d->movableSections) { + + bool acceptMoveSection = d->movableSections; + if (acceptMoveSection && d->pressed == 0 && !d->allowUserMoveOfSection0) + acceptMoveSection = false; // Do not allow moving the tree nod + + if (acceptMoveSection) { d->section = d->target = d->pressed; if (d->section == -1) return; @@ -2332,6 +2337,9 @@ void QHeaderView::mouseMoveEvent(QMouseEvent *e) int visual = visualIndexAt(pos); if (visual == -1) return; + if (visual == 0 && logicalIndex(0) == 0 && !d->allowUserMoveOfSection0) + return; + int posThreshold = d->headerSectionPosition(visual) - d->offset + d->headerSectionSize(visual) / 2; int moving = visualIndex(d->section); if (visual < moving) { diff --git a/src/widgets/itemviews/qheaderview.h b/src/widgets/itemviews/qheaderview.h index 1054e10ba1c..847758aa125 100644 --- a/src/widgets/itemviews/qheaderview.h +++ b/src/widgets/itemviews/qheaderview.h @@ -240,6 +240,9 @@ protected: QRegion visualRegionForSelection(const QItemSelection &selection) const; void initStyleOption(QStyleOptionHeader *option) const; + friend class QTableView; + friend class QTreeView; + private: Q_PRIVATE_SLOT(d_func(), void _q_sectionsRemoved(const QModelIndex &parent, int logicalFirst, int logicalLast)) Q_PRIVATE_SLOT(d_func(), void _q_layoutAboutToBeChanged()) diff --git a/src/widgets/itemviews/qheaderview_p.h b/src/widgets/itemviews/qheaderview_p.h index 4d9d0b8c931..7dcfcad01bf 100644 --- a/src/widgets/itemviews/qheaderview_p.h +++ b/src/widgets/itemviews/qheaderview_p.h @@ -91,6 +91,7 @@ public: stretchLastSection(false), cascadingResizing(false), resizeRecursionBlock(false), + allowUserMoveOfSection0(true), // will be false for QTreeView and true for QTableView stretchSections(0), contentsSections(0), minimumSectionSize(-1), @@ -234,6 +235,10 @@ public: } } + inline void setAllowUserMoveOfSection0(bool b) { + allowUserMoveOfSection0 = b; + } + void clear(); void flipSortIndicator(int section); void cascadingResize(int visual, int newSize); @@ -274,6 +279,7 @@ public: bool stretchLastSection; bool cascadingResizing; bool resizeRecursionBlock; + bool allowUserMoveOfSection0; int stretchSections; int contentsSections; int defaultSectionSize; diff --git a/src/widgets/itemviews/qtableview.cpp b/src/widgets/itemviews/qtableview.cpp index d84dc608b93..32869ad2927 100644 --- a/src/widgets/itemviews/qtableview.cpp +++ b/src/widgets/itemviews/qtableview.cpp @@ -53,6 +53,7 @@ #include #include #include +#include #ifndef QT_NO_ACCESSIBILITY #include #endif @@ -1181,6 +1182,7 @@ void QTableView::setHorizontalHeader(QHeaderView *header) delete d->horizontalHeader; d->horizontalHeader = header; d->horizontalHeader->setParent(this); + d->horizontalHeader->d_func()->setAllowUserMoveOfSection0(true); if (!d->horizontalHeader->model()) { d->horizontalHeader->setModel(d->model); if (d->selectionModel) @@ -1218,6 +1220,7 @@ void QTableView::setVerticalHeader(QHeaderView *header) delete d->verticalHeader; d->verticalHeader = header; d->verticalHeader->setParent(this); + d->verticalHeader->d_func()->setAllowUserMoveOfSection0(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 bcaf8dc2c3f..cf3d7155c10 100644 --- a/src/widgets/itemviews/qtreeview.cpp +++ b/src/widgets/itemviews/qtreeview.cpp @@ -58,6 +58,7 @@ #endif #include +#include QT_BEGIN_NAMESPACE @@ -313,6 +314,7 @@ void QTreeView::setHeader(QHeaderView *header) delete d->header; d->header = header; d->header->setParent(this); + d->header->d_func()->setAllowUserMoveOfSection0(false); if (!d->header->model()) { d->header->setModel(d->model); diff --git a/tests/manual/widgets/itemviews/qheaderview/qheaderviewtest1.cpp b/tests/manual/widgets/itemviews/qheaderview/qheaderviewtest1.cpp index 498042c1171..5a1db1383f5 100644 --- a/tests/manual/widgets/itemviews/qheaderview/qheaderviewtest1.cpp +++ b/tests/manual/widgets/itemviews/qheaderview/qheaderviewtest1.cpp @@ -101,9 +101,9 @@ int main(int argc, char *argv[]) m.setColumnCount(36); tv.setModel(&m); SomeHandler handler(tv.horizontalHeader(), &tv); - tv.horizontalHeader()->setDefaultSectionSize(200); + tv.horizontalHeader()->setDefaultSectionSize(50); + tv.horizontalHeader()->setSectionsMovable(true); tv.showMaximized(); - tv.horizontalScrollBar()->setValue(tv.horizontalScrollBar()->maximum()); app.exec(); } diff --git a/tests/manual/widgets/itemviews/qtreeview/main.cpp b/tests/manual/widgets/itemviews/qtreeview/main.cpp new file mode 100644 index 00000000000..0cb77da9b2a --- /dev/null +++ b/tests/manual/widgets/itemviews/qtreeview/main.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2012 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include +#include + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + QFileSystemModel *model = new QFileSystemModel; + model->setRootPath(QDir::currentPath()); + QTreeView *tree = new QTreeView(); + tree->setModel(model); + tree->show(); + app.exec(); +} diff --git a/tests/manual/widgets/itemviews/qtreeview/qtreeviewtest.pro b/tests/manual/widgets/itemviews/qtreeview/qtreeviewtest.pro new file mode 100644 index 00000000000..c241ee1045d --- /dev/null +++ b/tests/manual/widgets/itemviews/qtreeview/qtreeviewtest.pro @@ -0,0 +1,4 @@ +TEMPLATE = app +SOURCES = main.cpp +QT += widgets +DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0