summaryrefslogtreecommitdiffstats
path: root/tests/auto/qmainwindow
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@digia.com>2012-11-09 10:53:22 (GMT)
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-11-28 12:29:35 (GMT)
commitd8cbb158b7013fdf889657f6197eab1b972949be (patch)
tree0a7fe5df566d127297e1dfc912b41bec400472ae /tests/auto/qmainwindow
parentd1dfc461276ba53d870289b00a97d08df005e0b3 (diff)
downloadQt-d8cbb158b7013fdf889657f6197eab1b972949be.zip
Qt-d8cbb158b7013fdf889657f6197eab1b972949be.tar.gz
Qt-d8cbb158b7013fdf889657f6197eab1b972949be.tar.bz2
Fix conflict between QMainWindow::restoreState, QWidget::setStylesheet.
If QMainWindow::restoreState() then QWidget::setStylesheet() were called before the QMainWindow is shown, the size of QDockWidget can not be restored. QWidget::setStylesheet() will generate QEvent::StyleChange event, which will cause the function QDockAreaLayout::fitLayout() to be called before the layout of MainWindow is activated. Although the state info has been stored in a QMainWindowLayoutState variable by QMainWindow::restoreState(), but QMainWindowLayout::setGeometry() still isn't called at present. So QDockAreaLayout::fitLayout() will force the size of dockwidgets and centralwidget to be calculated using the wrong geometry, which will break the state restored by QMainWindow::restoreState(). This is a side effect of 692e9103ebb85b90e79377206d5d03b704d43d42. This patch is a backport of d2f65aa470fe30849a01380e4a50e8a4ebbce07e. Task-number: QTBUG-15080 Change-Id: I5b912e80e99b1f8b7a6f2a9a3e541fac3455c3db Reviewed-by: Olivier Goffart <ogoffart@woboq.com> Reviewed-by: Andy Shaw <andy.shaw@digia.com> Reviewed-by: Debao Zhang <hello@debao.me>
Diffstat (limited to 'tests/auto/qmainwindow')
-rw-r--r--tests/auto/qmainwindow/tst_qmainwindow.cpp41
1 files changed, 41 insertions, 0 deletions
diff --git a/tests/auto/qmainwindow/tst_qmainwindow.cpp b/tests/auto/qmainwindow/tst_qmainwindow.cpp
index b4d765c..4eb3c22 100644
--- a/tests/auto/qmainwindow/tst_qmainwindow.cpp
+++ b/tests/auto/qmainwindow/tst_qmainwindow.cpp
@@ -140,6 +140,7 @@ private slots:
void saveState();
void restoreState();
void restoreStateFromPreviousVersion();
+ void restoreStateDockWidgetBug();
void createPopupMenu();
void iconSizeChanged();
void toolButtonStyleChanged();
@@ -1285,6 +1286,46 @@ void tst_QMainWindow::restoreState()
QVERIFY(mw.restoreState(state, 1));
}
+/*
+ QWidget::setStylesheet() generates QEvent::StyleChange event, which will
+ cause the function QDockAreaLayout::fitLayout() to be called before the layout
+ of MainWindow is activated. This will force the size of dock widgets
+ and the central widget to be calculated using the wrong geometry, which will
+ break the state restored by QMainWindow::restoreState().
+*/
+void tst_QMainWindow::restoreStateDockWidgetBug()
+{
+ QByteArray state;
+
+ //save state
+ {
+ QMainWindow mw1;
+ QDockWidget *dw1 = new QDockWidget();
+ dw1->setObjectName("Left DockWidget");
+ mw1.addDockWidget(Qt::LeftDockWidgetArea, dw1);
+ mw1.setCentralWidget(new QTextEdit());
+ mw1.show();
+ QApplication::processEvents();
+ dw1->setFixedWidth(101);
+ QApplication::processEvents();
+
+ state = mw1.saveState();
+ }
+
+ //restore state
+ QMainWindow mw2;
+ QDockWidget *dw2 = new QDockWidget();
+ dw2->setObjectName("Left DockWidget");
+ mw2.addDockWidget(Qt::LeftDockWidgetArea, dw2);
+ mw2.setCentralWidget(new QTextEdit());
+ mw2.restoreState(state);
+ mw2.setStyleSheet("color:red");
+ mw2.show();
+ QApplication::processEvents();
+
+ QCOMPARE(dw2->width(), 101);
+}
+
//tests the restoration of the previous versions of window settings
void tst_QMainWindow::restoreStateFromPreviousVersion()
{