From 2e78d7ac30813add2f57f8b50c969fb71212e3e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorbj=C3=B8rn=20Lund=20Martsum?= Date: Wed, 31 Oct 2012 16:01:53 +0100 Subject: QHeaderView - Fix auto-scroll on manual move on sections This patch fixes the manual move of sections when auto scroll is on. It is done in QAbstractItemView::doAutoScroll by letting the qheaderView use its parents scrollbars if they are childs of a QTableView or QTreeView. Task-number: QTBUG-993 Task-number: QTBUG-1103 Change-Id: I70d999d9a07c3566e42d01cc5ebb47a69a83d9d4 Reviewed-by: Stephen Kelly --- src/widgets/itemviews/qabstractitemview.cpp | 19 +++++++++++++++++++ src/widgets/itemviews/qheaderview.cpp | 2 ++ .../itemviews/qheaderview/qheaderviewtest1.cpp | 10 +++++----- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/widgets/itemviews/qabstractitemview.cpp b/src/widgets/itemviews/qabstractitemview.cpp index 8ba078ffd3..57c3b44aaa 100644 --- a/src/widgets/itemviews/qabstractitemview.cpp +++ b/src/widgets/itemviews/qabstractitemview.cpp @@ -55,6 +55,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -3749,6 +3752,22 @@ void QAbstractItemView::doAutoScroll() QScrollBar *verticalScroll = verticalScrollBar(); QScrollBar *horizontalScroll = horizontalScrollBar(); + // QHeaderView does not (normally) have scrollbars + // It needs to use its parents scroll instead + QHeaderView *hv = qobject_cast(this); + if (hv) { + QAbstractScrollArea *parent = qobject_cast(parentWidget()); + if (parent) { + if (hv->orientation() == Qt::Horizontal) { + if (!hv->horizontalScrollBar() || !hv->horizontalScrollBar()->isVisible()) + horizontalScroll = parent->horizontalScrollBar(); + } else { + if (!hv->verticalScrollBar() || !hv->verticalScrollBar()->isVisible()) + verticalScroll = parent->verticalScrollBar(); + } + } + } + int verticalStep = verticalScroll->pageStep(); int horizontalStep = horizontalScroll->pageStep(); if (d->autoScrollCount < qMax(verticalStep, horizontalStep)) diff --git a/src/widgets/itemviews/qheaderview.cpp b/src/widgets/itemviews/qheaderview.cpp index dc80a4b81f..6326b497c5 100644 --- a/src/widgets/itemviews/qheaderview.cpp +++ b/src/widgets/itemviews/qheaderview.cpp @@ -2333,6 +2333,8 @@ void QHeaderView::mouseMoveEvent(QMouseEvent *e) return; } case QHeaderViewPrivate::MoveSection: { + if (d->shouldAutoScroll(e->pos())) + d->startAutoScroll(); if (qAbs(pos - d->firstPos) >= QApplication::startDragDistance() || !d->sectionIndicator->isHidden()) { int visual = visualIndexAt(pos); diff --git a/tests/manual/widgets/itemviews/qheaderview/qheaderviewtest1.cpp b/tests/manual/widgets/itemviews/qheaderview/qheaderviewtest1.cpp index 5a1db1383f..2fc7bbec43 100644 --- a/tests/manual/widgets/itemviews/qheaderview/qheaderviewtest1.cpp +++ b/tests/manual/widgets/itemviews/qheaderview/qheaderviewtest1.cpp @@ -97,14 +97,14 @@ int main(int argc, char *argv[]) QApplication app(argc, argv); QTableView tv; QStandardItemModel m; - m.setRowCount(10); - m.setColumnCount(36); + m.setRowCount(500); + m.setColumnCount(250); tv.setModel(&m); SomeHandler handler(tv.horizontalHeader(), &tv); - tv.horizontalHeader()->setDefaultSectionSize(50); + tv.horizontalHeader()->setDefaultSectionSize(30); + tv.show(); tv.horizontalHeader()->setSectionsMovable(true); - tv.showMaximized(); + tv.verticalHeader()->setSectionsMovable(true); app.exec(); } - #include "qheaderviewtest1.moc" -- cgit v1.2.3