From 2bfee10f3ab8e8e33b2169d735baedcdd9f2b584 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Wed, 22 Oct 2014 13:47:55 +0200 Subject: QMainWindow: respect the maximum size of the central widget MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make sure the dock widgets get the available space when the central widget cannot expand any more. [ChangeLog][QtWidgets][QMainWindow] Dock widgets will now be resized properly when the central widget has a fixed size. Task-number: QTBUG-40410 Change-Id: Id06c07b79aa3102aa41212fa2c621f5fa426fe02 Reviewed-by: Friedemann Kleint Reviewed-by: Jan Arve Sæther --- src/widgets/widgets/qdockarealayout.cpp | 6 ++- .../widgets/qmainwindow/tst_qmainwindow.cpp | 45 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/src/widgets/widgets/qdockarealayout.cpp b/src/widgets/widgets/qdockarealayout.cpp index 7ac2791112..702cd8bac9 100644 --- a/src/widgets/widgets/qdockarealayout.cpp +++ b/src/widgets/widgets/qdockarealayout.cpp @@ -2575,12 +2575,14 @@ void QDockAreaLayout::getGrid(QVector *_ver_struct_list, { QSize center_hint(0, 0); QSize center_min(0, 0); + QSize center_max(0, 0); const bool have_central = centralWidgetItem != 0 && !centralWidgetItem->isEmpty(); if (have_central) { center_hint = centralWidgetRect.size(); if (!center_hint.isValid()) center_hint = centralWidgetItem->sizeHint(); center_min = centralWidgetItem->minimumSize(); + center_max = centralWidgetItem->maximumSize(); } QRect center_rect = rect; @@ -2656,7 +2658,7 @@ void QDockAreaLayout::getGrid(QVector *_ver_struct_list, left = (tl_significant && bl_significant) ? left_min.height() : 0; right = (tr_significant && br_significant) ? right_min.height() : 0; ver_struct_list[1].minimumSize = qMax(left, center_min.height(), right); - ver_struct_list[1].maximumSize = have_central ? QWIDGETSIZE_MAX : 0; + ver_struct_list[1].maximumSize = center_max.height(); ver_struct_list[1].expansive = have_central; ver_struct_list[1].empty = docks[QInternal::LeftDock].isEmpty() && !have_central @@ -2717,7 +2719,7 @@ void QDockAreaLayout::getGrid(QVector *_ver_struct_list, bottom = (bl_significant && br_significant) ? bottom_min.width() : 0; hor_struct_list[1].minimumSize = qMax(top, center_min.width(), bottom); - hor_struct_list[1].maximumSize = have_central ? QWIDGETSIZE_MAX : 0; + hor_struct_list[1].maximumSize = center_max.width(); hor_struct_list[1].expansive = have_central; hor_struct_list[1].empty = !have_central; hor_struct_list[1].pos = center_rect.left(); diff --git a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp index ebda07ee0c..27c803b43d 100644 --- a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp +++ b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp @@ -137,6 +137,7 @@ private slots: #endif void addToolbarAfterShow(); void centralWidgetSize(); + void fixedSizeCentralWidget(); void dockWidgetSize(); void QTBUG2774_stylechange(); void QTBUG15080_restoreState(); @@ -1737,6 +1738,50 @@ void tst_QMainWindow::centralWidgetSize() QTRY_COMPARE(widget.size(), widget.sizeHint()); } +void tst_QMainWindow::fixedSizeCentralWidget() +{ + // QTBUG-40410: dock widgets does not get all the available space when + // central widget is fixed size + QMainWindow mainWindow; + mainWindow.setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); + + MyWidget widget; + widget.setFixedSize(100,100); + mainWindow.setCentralWidget(&widget); + + QDockWidget dock("D1"); + QWidget *child = new MyWidget; + dock.setWidget(child); + mainWindow.addDockWidget(Qt::TopDockWidgetArea, &dock); + + QDockWidget dock2("D2"); + dock2.setWidget(new MyWidget); + mainWindow.addDockWidget(Qt::LeftDockWidgetArea, &dock2); + + QSize sizeH = mainWindow.sizeHint(); + QSize mwSize = QSize(sizeH.width(), sizeH.height() * 2); + mainWindow.resize(mwSize); + mainWindow.show(); + QVERIFY(QTest::qWaitForWindowExposed(&mainWindow)); + if (mainWindow.height() < mwSize.height()) + QSKIP("The screen is too small for this test"); + + // first, check that we get more than the size hint when we have more space + QTRY_VERIFY(child->height() > child->sizeHint().height()); + int childHeight = child->height(); + + if (qGuiApp->styleHints()->showIsFullScreen()) + QSKIP("The platform is auto maximizing, so we cannot resize the window"); + + // then, check that we get nothing when there is no space + mainWindow.resize(100,100); + QTRY_COMPARE(child->height(), 0); + + // finally verify that we get the space back when we resize to the old size + mainWindow.resize(mwSize); + QTRY_COMPARE(child->height(), childHeight); +} + void tst_QMainWindow::dockWidgetSize() { QMainWindow mainWindow; -- cgit v1.2.3