From 9f1aa866bda7678261f2f441d4cfd5bb524c2411 Mon Sep 17 00:00:00 2001 From: Jo Asplin Date: Thu, 20 Oct 2011 13:17:26 +0200 Subject: Moved tests into integrationtests/ and widgets/ Task-number: QTBUG-19013 Change-Id: Ibb776f5967c0645ce6d22ef7afdc40657c575461 Reviewed-by: Holger Ihrig --- .../widgets/qmainwindow/tst_qmainwindow.cpp | 1742 ++++++++++++++++++++ 1 file changed, 1742 insertions(+) create mode 100644 tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp (limited to 'tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp') diff --git a/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp new file mode 100644 index 0000000000..9722a3194b --- /dev/null +++ b/tests/auto/widgets/widgets/qmainwindow/tst_qmainwindow.cpp @@ -0,0 +1,1742 @@ +/**************************************************************************** +** +** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** GNU Lesser General Public License Usage +** 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, Nokia gives you certain additional +** rights. These rights are described in the Nokia 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. +** +** Other Usage +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + + +#include + + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "../../../platformquirks.h" + +//TESTED_FILES= + +static uchar restoreData41[] = { 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xfd, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, 0x1, 0x19, 0xfc, 0x2, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x30, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x34, 0x1, 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x38, 0x1, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x32, 0x1, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x64, 0x0, 0x0, 0x1, 0x19, 0xfc, 0x2, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x35, 0x1, 0x0, 0x0, 0x0, 0x49, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x39, 0x1, 0x0, 0x0, 0x0, 0x8d, 0x0, 0x0, 0x0, 0x43, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x33, 0x1, 0x0, 0x0, 0x0, 0xd4, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x89, 0x0, 0x0, 0x0, 0xe, 0xfc, 0x1, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x32, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x36, 0x1, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x30, 0x1, 0x0, 0x0, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x5e, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x34, 0x1, 0x0, 0x0, 0x1, 0x2a, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0x89, 0x0, 0x0, 0x0, 0xe, 0xfc, 0x1, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x33, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x37, 0x1, 0x0, 0x0, 0x0, 0x63, 0x0, 0x0, 0x0, 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x31, 0x1, 0x0, 0x0, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x5e, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x35, 0x1, 0x0, 0x0, 0x1, 0x2a, 0x0, 0x0, 0x0, 0x5f, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xc1, 0x0, 0x0, 0x1, 0x19}; +static uchar restoreData42[] = { 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0xfd, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x2, 0x2b, 0xfc, 0x2, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x30, 0x1, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x21, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x34, 0x1, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x21, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x38, 0x1, 0x0, 0x0, 0x1, 0x42, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x21, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x32, 0x1, 0x0, 0x0, 0x1, 0xcd, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x21, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x98, 0x0, 0x0, 0x2, 0x2b, 0xfc, 0x2, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x1, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x21, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x35, 0x1, 0x0, 0x0, 0x0, 0xb6, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x21, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x39, 0x1, 0x0, 0x0, 0x1, 0x42, 0x0, 0x0, 0x0, 0x87, 0x0, 0x0, 0x0, 0x21, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x33, 0x1, 0x0, 0x0, 0x1, 0xcd, 0x0, 0x0, 0x0, 0x88, 0x0, 0x0, 0x0, 0x21, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x4, 0x4e, 0x0, 0x0, 0x0, 0x26, 0xfc, 0x1, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x32, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x12, 0x0, 0x0, 0x0, 0xa, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x36, 0x1, 0x0, 0x0, 0x1, 0x16, 0x0, 0x0, 0x1, 0xe, 0x0, 0x0, 0x0, 0xa, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x30, 0x1, 0x0, 0x0, 0x2, 0x28, 0x0, 0x0, 0x1, 0x14, 0x0, 0x0, 0x0, 0xa, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x34, 0x1, 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, 0x1, 0xe, 0x0, 0x0, 0x0, 0xa, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x4, 0x4e, 0x0, 0x0, 0x0, 0x26, 0xfc, 0x1, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x33, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x12, 0x0, 0x0, 0x0, 0xa, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x37, 0x1, 0x0, 0x0, 0x1, 0x16, 0x0, 0x0, 0x1, 0xe, 0x0, 0x0, 0x0, 0xa, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x31, 0x1, 0x0, 0x0, 0x2, 0x28, 0x0, 0x0, 0x1, 0x14, 0x0, 0x0, 0x0, 0xa, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x35, 0x1, 0x0, 0x0, 0x3, 0x40, 0x0, 0x0, 0x1, 0xe, 0x0, 0x0, 0x0, 0xa, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3, 0x8a, 0x0, 0x0, 0x2, 0x2b, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x8}; +static uchar restoreData43[] = { 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x0, 0xfd, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x50, 0x0, 0x0, 0x0, 0xa0, 0xfc, 0x2, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x30, 0x1, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x16, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x34, 0x1, 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x16, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x38, 0x1, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x16, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x32, 0x1, 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x16, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x98, 0x0, 0x0, 0x0, 0xa0, 0xfc, 0x2, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x1, 0x0, 0x0, 0x0, 0x2a, 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x16, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x35, 0x1, 0x0, 0x0, 0x0, 0x53, 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x16, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x39, 0x1, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x16, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x33, 0x1, 0x0, 0x0, 0x0, 0xa5, 0x0, 0x0, 0x0, 0x25, 0x0, 0x0, 0x0, 0x16, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0xa8, 0x0, 0x0, 0x0, 0x26, 0xfc, 0x1, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x32, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x50, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x36, 0x1, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x50, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x30, 0x1, 0x0, 0x0, 0x0, 0xd6, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x50, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x34, 0x1, 0x0, 0x0, 0x1, 0x42, 0x0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x50, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x1, 0xa8, 0x0, 0x0, 0x0, 0x26, 0xfc, 0x1, 0x0, 0x0, 0x0, 0x4, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x33, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x50, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xc, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x37, 0x1, 0x0, 0x0, 0x0, 0x6c, 0x0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x50, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x31, 0x1, 0x0, 0x0, 0x0, 0xd6, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x0, 0x50, 0x0, 0xff, 0xff, 0xff, 0xfb, 0x0, 0x0, 0x0, 0xe, 0x0, 0x64, 0x0, 0x6f, 0x0, 0x63, 0x0, 0x6b, 0x0, 0x20, 0x0, 0x31, 0x0, 0x35, 0x1, 0x0, 0x0, 0x1, 0x42, 0x0, 0x0, 0x0, 0x66, 0x0, 0x0, 0x0, 0x50, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0xb8, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x0, 0x0, 0x0, 0x0}; + +class tst_QMainWindow : public QObject +{ + Q_OBJECT + +public: + tst_QMainWindow(); + +private slots: + void getSetCheck(); + void constructor(); + void iconSize(); + void toolButtonStyle(); +#ifndef Q_WS_WINCE_WM + void menuBar(); +#endif + void statusBar(); + void centralWidget(); + void corner(); + void addToolBarBreak(); + void insertToolBarBreak(); + void addToolBar(); + void insertToolBar(); + void removeToolBar(); + void toolBarArea(); + void addDockWidget(); + void splitDockWidget(); + void removeDockWidget(); + void dockWidgetArea(); + void restoreState(); + void restoreStateFromPreviousVersion(); + void createPopupMenu(); + void hideBeforeLayout(); + void saveRestore(); + void saveRestore_data(); + void isSeparator(); +#ifndef QT_NO_CURSOR + void setCursor(); +#endif + void addToolbarAfterShow(); + void centralWidgetSize(); + void dockWidgetSize(); + void QTBUG2774_stylechange(); +#ifdef Q_OS_MAC + void toggleUnifiedTitleAndToolBarOnMac(); +#endif +}; + +// Testing get/set functions +void tst_QMainWindow::getSetCheck() +{ + QMainWindow obj1; + // QMenuBar * QMainWindow::menuBar() + // void QMainWindow::setMenuBar(QMenuBar *) + QPointer var1 = new QMenuBar; + obj1.setMenuBar(var1); + QCOMPARE(static_cast(var1), obj1.menuBar()); + obj1.setMenuBar((QMenuBar *)0); + QVERIFY(obj1.menuBar()); + //we now call deleteLater on the previous menubar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(!var1); + // delete var1; // No delete, since QMainWindow takes ownership + + // QStatusBar * QMainWindow::statusBar() + // void QMainWindow::setStatusBar(QStatusBar *) + QPointer var2 = new QStatusBar; + obj1.setStatusBar(var2); + QCOMPARE(static_cast(var2), obj1.statusBar()); + obj1.setStatusBar((QStatusBar *)0); + QVERIFY(obj1.statusBar()); + //we now call deleteLater on the previous menubar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(!var2); + // delete var2; // No delete, since QMainWindow takes ownership + + // QWidget * QMainWindow::centralWidget() + // void QMainWindow::setCentralWidget(QWidget *) + QWidget *var3 = new QWidget; + obj1.setCentralWidget(var3); + QCOMPARE(var3, obj1.centralWidget()); + obj1.setCentralWidget((QWidget *)0); + QCOMPARE((QWidget *)0, obj1.centralWidget()); + // delete var3; // No delete, since QMainWindow takes ownership +} + +tst_QMainWindow::tst_QMainWindow() +{ + qRegisterMetaType("QSize"); + qRegisterMetaType("Qt::ToolButtonStyle"); +} + +void tst_QMainWindow::constructor() +{ + QMainWindow mw; + QVERIFY(mw.parentWidget() == 0); + QVERIFY(mw.isWindow()); + + QMainWindow mw2(&mw); + QVERIFY(mw2.parentWidget() == &mw); + QVERIFY(mw2.isWindow()); + + QMainWindow mw3(&mw, Qt::FramelessWindowHint); + QVERIFY(mw3.parentWidget() == &mw); + QVERIFY(mw3.isWindow()); +} + +void tst_QMainWindow::iconSize() +{ + { + QMainWindow mw; + QSignalSpy spy(&mw, SIGNAL(iconSizeChanged(QSize))); + + // the default is determined by the style + const int metric = mw.style()->pixelMetric(QStyle::PM_ToolBarIconSize); + const QSize defaultIconSize = QSize(metric, metric); + const QSize smallIconSize = QSize(metric / 2, metric / 2); + const QSize largeIconSize = QSize(metric * 2, metric * 2); + + // no-op + QCOMPARE(mw.iconSize(), defaultIconSize); + mw.setIconSize(defaultIconSize); + QCOMPARE(mw.iconSize(), defaultIconSize); + QCOMPARE(spy.size(), 0); + + mw.setIconSize(largeIconSize); + QCOMPARE(mw.iconSize(), largeIconSize); + QCOMPARE(spy.size(), 1); + QCOMPARE(spy.first().first().toSize(), largeIconSize); + spy.clear(); + + // no-op + QCOMPARE(mw.iconSize(), largeIconSize); + mw.setIconSize(largeIconSize); + QCOMPARE(mw.iconSize(), largeIconSize); + QCOMPARE(spy.size(), 0); + + mw.setIconSize(smallIconSize); + QCOMPARE(mw.iconSize(), smallIconSize); + QCOMPARE(spy.size(), 1); + QCOMPARE(spy.first().first().toSize(), smallIconSize); + spy.clear(); + + // no-op + QCOMPARE(mw.iconSize(), smallIconSize); + mw.setIconSize(smallIconSize); + QCOMPARE(mw.iconSize(), smallIconSize); + QCOMPARE(spy.size(), 0); + + // setting the icon size to an invalid QSize will reset the + // iconSize property to the default + mw.setIconSize(QSize()); + QCOMPARE(mw.iconSize(), defaultIconSize); + QCOMPARE(spy.size(), 1); + QCOMPARE(spy.first().first().toSize(), defaultIconSize); + spy.clear(); + } + + { + // toolbars should follow the mainwindow's icon size + QMainWindow mw; + QToolBar tb; + mw.addToolBar(&tb); + + QSignalSpy mwSpy(&mw, SIGNAL(iconSizeChanged(QSize))); + QSignalSpy tbSpy(&tb, SIGNAL(iconSizeChanged(QSize))); + + // the default is determined by the style + const int metric = mw.style()->pixelMetric(QStyle::PM_ToolBarIconSize); + const QSize defaultIconSize = QSize(metric, metric); + const QSize smallIconSize = QSize(metric / 2, metric / 2); + const QSize largeIconSize = QSize(metric * 2, metric * 2); + + // no-op + QCOMPARE(mw.iconSize(), defaultIconSize); + mw.setIconSize(defaultIconSize); + QCOMPARE(mw.iconSize(), defaultIconSize); + QCOMPARE(tb.iconSize(), defaultIconSize); + QCOMPARE(mwSpy.size(), 0); + QCOMPARE(tbSpy.size(), 0); + + mw.setIconSize(largeIconSize); + QCOMPARE(mw.iconSize(), largeIconSize); + QCOMPARE(tb.iconSize(), largeIconSize); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(mwSpy.first().first().toSize(), largeIconSize); + QCOMPARE(tbSpy.size(), 1); + QCOMPARE(tbSpy.first().first().toSize(), largeIconSize); + mwSpy.clear(); + tbSpy.clear(); + + // no-op + QCOMPARE(mw.iconSize(), largeIconSize); + mw.setIconSize(largeIconSize); + QCOMPARE(mw.iconSize(), largeIconSize); + QCOMPARE(tb.iconSize(), largeIconSize); + QCOMPARE(mwSpy.size(), 0); + QCOMPARE(tbSpy.size(), 0); + + mw.setIconSize(smallIconSize); + QCOMPARE(mw.iconSize(), smallIconSize); + QCOMPARE(tb.iconSize(), smallIconSize); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(mwSpy.first().first().toSize(), smallIconSize); + QCOMPARE(tbSpy.size(), 1); + QCOMPARE(tbSpy.first().first().toSize(), smallIconSize); + mwSpy.clear(); + tbSpy.clear(); + + // no-op + QCOMPARE(mw.iconSize(), smallIconSize); + mw.setIconSize(smallIconSize); + QCOMPARE(mw.iconSize(), smallIconSize); + QCOMPARE(tb.iconSize(), smallIconSize); + QCOMPARE(mwSpy.size(), 0); + QCOMPARE(tbSpy.size(), 0); + + // setting the icon size to an invalid QSize will reset the + // iconSize property to the default + mw.setIconSize(QSize()); + QCOMPARE(mw.iconSize(), defaultIconSize); + QCOMPARE(tb.iconSize(), defaultIconSize); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(mwSpy.first().first().toSize(), defaultIconSize); + QCOMPARE(tbSpy.size(), 1); + QCOMPARE(tbSpy.first().first().toSize(), defaultIconSize); + mwSpy.clear(); + tbSpy.clear(); + } + + { + QMainWindow mw; + QSignalSpy mwSpy(&mw, SIGNAL(iconSizeChanged(QSize))); + + // the default is determined by the style + const int metric = mw.style()->pixelMetric(QStyle::PM_ToolBarIconSize); + const QSize defaultIconSize = QSize(metric, metric); + const QSize smallIconSize = QSize(metric / 2, metric / 2); + const QSize largeIconSize = QSize(metric * 2, metric * 2); + + mw.setIconSize(smallIconSize); + QCOMPARE(mw.iconSize(), smallIconSize); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(mwSpy.first().first().toSize(), smallIconSize); + mwSpy.clear(); + + QToolBar tb; + QSignalSpy tbSpy(&tb, SIGNAL(iconSizeChanged(QSize))); + + mw.addToolBar(&tb); + + // newly added toolbars should also automatically pick up any + // size set on the main window + QCOMPARE(tb.iconSize(), smallIconSize); + QCOMPARE(tbSpy.size(), 1); + QCOMPARE(tbSpy.first().first().toSize(), smallIconSize); + tbSpy.clear(); + + mw.removeToolBar(&tb); + + // removed toolbars should keep their existing size and ignore + // mainwindow icon size changes + mw.setIconSize(largeIconSize); + QCOMPARE(mw.iconSize(), largeIconSize); + QCOMPARE(tb.iconSize(), smallIconSize); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(mwSpy.first().first().toSize(), largeIconSize); + QCOMPARE(tbSpy.size(), 0); + mwSpy.clear(); + } +} + +void tst_QMainWindow::toolButtonStyle() +{ + { + QMainWindow mw; + + QSignalSpy spy(&mw, SIGNAL(toolButtonStyleChanged(Qt::ToolButtonStyle))); + + // no-op + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonIconOnly); + mw.setToolButtonStyle(Qt::ToolButtonIconOnly); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonIconOnly); + QCOMPARE(spy.size(), 0); + + mw.setToolButtonStyle(Qt::ToolButtonTextOnly); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextOnly); + QCOMPARE(spy.size(), 1); + QCOMPARE(*static_cast(spy.first().first().constData()), + Qt::ToolButtonTextOnly); + spy.clear(); + + // no-op + mw.setToolButtonStyle(Qt::ToolButtonTextOnly); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextOnly); + QCOMPARE(spy.size(), 0); + + mw.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextBesideIcon); + QCOMPARE(spy.size(), 1); + QCOMPARE(*static_cast(spy.first().first().constData()), + Qt::ToolButtonTextBesideIcon); + spy.clear(); + + // no-op + mw.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextBesideIcon); + QCOMPARE(spy.size(), 0); + + mw.setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextUnderIcon); + QCOMPARE(spy.size(), 1); + QCOMPARE(*static_cast(spy.first().first().constData()), + Qt::ToolButtonTextUnderIcon); + spy.clear(); + + // no-op + mw.setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextUnderIcon); + QCOMPARE(spy.size(), 0); + + mw.setToolButtonStyle(Qt::ToolButtonIconOnly); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonIconOnly); + QCOMPARE(spy.size(), 1); + QCOMPARE(*static_cast(spy.first().first().constData()), + Qt::ToolButtonIconOnly); + spy.clear(); + + // no-op + mw.setToolButtonStyle(Qt::ToolButtonIconOnly); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonIconOnly); + QCOMPARE(spy.size(), 0); + } + + { + // toolbars should follow the mainwindow's tool button style + QMainWindow mw; + QToolBar tb; + mw.addToolBar(&tb); + + QSignalSpy mwSpy(&mw, SIGNAL(toolButtonStyleChanged(Qt::ToolButtonStyle))); + QSignalSpy tbSpy(&tb, SIGNAL(toolButtonStyleChanged(Qt::ToolButtonStyle))); + + // no-op + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonIconOnly); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonIconOnly); + mw.setToolButtonStyle(Qt::ToolButtonIconOnly); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonIconOnly); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonIconOnly); + QCOMPARE(mwSpy.size(), 0); + QCOMPARE(tbSpy.size(), 0); + + mw.setToolButtonStyle(Qt::ToolButtonTextOnly); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextOnly); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonTextOnly); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(tbSpy.size(), 1); + QCOMPARE(*static_cast(mwSpy.first().first().constData()), + Qt::ToolButtonTextOnly); + QCOMPARE(*static_cast(tbSpy.first().first().constData()), + Qt::ToolButtonTextOnly); + mwSpy.clear(); + tbSpy.clear(); + + // no-op + mw.setToolButtonStyle(Qt::ToolButtonTextOnly); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextOnly); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonTextOnly); + QCOMPARE(mwSpy.size(), 0); + QCOMPARE(tbSpy.size(), 0); + + mw.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextBesideIcon); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonTextBesideIcon); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(tbSpy.size(), 1); + QCOMPARE(*static_cast(mwSpy.first().first().constData()), + Qt::ToolButtonTextBesideIcon); + QCOMPARE(*static_cast(tbSpy.first().first().constData()), + Qt::ToolButtonTextBesideIcon); + mwSpy.clear(); + tbSpy.clear(); + + // no-op + mw.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextBesideIcon); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonTextBesideIcon); + QCOMPARE(mwSpy.size(), 0); + QCOMPARE(tbSpy.size(), 0); + + mw.setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextUnderIcon); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonTextUnderIcon); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(tbSpy.size(), 1); + QCOMPARE(*static_cast(mwSpy.first().first().constData()), + Qt::ToolButtonTextUnderIcon); + QCOMPARE(*static_cast(tbSpy.first().first().constData()), + Qt::ToolButtonTextUnderIcon); + mwSpy.clear(); + tbSpy.clear(); + + // no-op + mw.setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextUnderIcon); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonTextUnderIcon); + QCOMPARE(mwSpy.size(), 0); + QCOMPARE(tbSpy.size(), 0); + + mw.setToolButtonStyle(Qt::ToolButtonIconOnly); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonIconOnly); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonIconOnly); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(tbSpy.size(), 1); + QCOMPARE(*static_cast(mwSpy.first().first().constData()), + Qt::ToolButtonIconOnly); + QCOMPARE(*static_cast(tbSpy.first().first().constData()), + Qt::ToolButtonIconOnly); + mwSpy.clear(); + tbSpy.clear(); + + // no-op + mw.setToolButtonStyle(Qt::ToolButtonIconOnly); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonIconOnly); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonIconOnly); + QCOMPARE(mwSpy.size(), 0); + QCOMPARE(tbSpy.size(), 0); + } + + { + QMainWindow mw; + QSignalSpy mwSpy(&mw, SIGNAL(toolButtonStyleChanged(Qt::ToolButtonStyle))); + + mw.setToolButtonStyle(Qt::ToolButtonTextBesideIcon); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextBesideIcon); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(*static_cast(mwSpy.first().first().constData()), + Qt::ToolButtonTextBesideIcon); + mwSpy.clear(); + + QToolBar tb; + QSignalSpy tbSpy(&tb, SIGNAL(toolButtonStyleChanged(Qt::ToolButtonStyle))); + + mw.addToolBar(&tb); + + // newly added toolbars should also automatically pick up any + // size set on the main window + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonTextBesideIcon); + QCOMPARE(tbSpy.size(), 1); + QCOMPARE(*static_cast(tbSpy.first().first().constData()), + Qt::ToolButtonTextBesideIcon); + tbSpy.clear(); + + mw.removeToolBar(&tb); + + // removed toolbars should keep their existing size and ignore + // mainwindow icon size changes + mw.setToolButtonStyle(Qt::ToolButtonTextUnderIcon); + QCOMPARE(mw.toolButtonStyle(), Qt::ToolButtonTextUnderIcon); + QCOMPARE(tb.toolButtonStyle(), Qt::ToolButtonTextBesideIcon); + QCOMPARE(mwSpy.size(), 1); + QCOMPARE(*static_cast(mwSpy.first().first().constData()), + Qt::ToolButtonTextUnderIcon); + QCOMPARE(tbSpy.size(), 0); + mwSpy.clear(); + } +} + +// With native menubar integration on Windows Mobile the menubar is not a child +#ifndef Q_WS_WINCE_WM +void tst_QMainWindow::menuBar() +{ + { + QMainWindow mw; + QVERIFY(mw.menuBar() != 0); + } + + { + QMainWindow mw; + QPointer mb1 = new QMenuBar; + QPointer mb2 = new QMenuBar; + + mw.setMenuBar(mb1); + QVERIFY(mw.menuBar() != 0); + QCOMPARE(mw.menuBar(), (QMenuBar *)mb1); + QCOMPARE(mb1->parentWidget(), (QWidget *)&mw); + + mw.setMenuBar(0); + QVERIFY(mw.menuBar() != 0); + //we now call deleteLater on the previous menubar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(mb1 == 0); + + mw.setMenuBar(mb2); + QVERIFY(mw.menuBar() != 0); + QCOMPARE(mw.menuBar(), (QMenuBar *)mb2); + QCOMPARE(mb2->parentWidget(), (QWidget *)&mw); + + mw.setMenuBar(0); + QVERIFY(mw.menuBar() != 0); + //we now call deleteLater on the previous menubar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(mb2 == 0); + + mb1 = new QMenuBar; + mw.setMenuBar(mb1); + QVERIFY(mw.menuBar() != 0); + QCOMPARE(mw.menuBar(), (QMenuBar *)mb1); + + mb2 = new QMenuBar; + mw.setMenuBar(mb2); + QVERIFY(mw.menuBar() != 0); + QCOMPARE(mw.menuBar(), (QMenuBar *)mb2); + //we now call deleteLater on the previous menubar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(mb1 == 0); + + mb1 = new QMenuBar; + mw.setMenuBar(mb1); + QVERIFY(mw.menuBar() != 0); + QCOMPARE(mw.menuBar(), (QMenuBar *)mb1); + //we now call deleteLater on the previous menubar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(mb2 == 0); + + QPointer topLeftCornerWidget = new QWidget; + mb1->setCornerWidget(topLeftCornerWidget, Qt::TopLeftCorner); + QPointer topRightCornerWidget = new QWidget; + mb1->setCornerWidget(topRightCornerWidget, Qt::TopRightCorner); + + mb2 = new QMenuBar; + mw.setMenuBar(mb2); + QVERIFY(mw.menuBar() != 0); + QCOMPARE(mw.menuBar(), (QMenuBar *)mb2); + //we now call deleteLater on the previous menubar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(mb1 == 0); + + QVERIFY(topLeftCornerWidget); + QCOMPARE(mb2->cornerWidget(Qt::TopLeftCorner), static_cast(topLeftCornerWidget)); + QVERIFY(topRightCornerWidget); + QCOMPARE(mb2->cornerWidget(Qt::TopRightCorner), static_cast(topRightCornerWidget)); + + mw.setMenuBar(0); + QVERIFY(mw.menuBar() != 0); + //we now call deleteLater on the previous menubar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(mb2 == 0); + + QVERIFY(!topLeftCornerWidget); + QVERIFY(!topRightCornerWidget); + } +} +#endif + +void tst_QMainWindow::statusBar() +{ + { + QMainWindow mw; + QVERIFY(mw.statusBar() != 0); + } + + { + QMainWindow mw; + QPointer sb1 = new QStatusBar; + QPointer sb2 = new QStatusBar; + + mw.setStatusBar(sb1); + QVERIFY(mw.statusBar() != 0); + QCOMPARE(mw.statusBar(), (QStatusBar *)sb1); + QCOMPARE(sb1->parentWidget(), (QWidget *)&mw); + + mw.setStatusBar(0); + QVERIFY(mw.statusBar() != 0); + //we now call deleteLater on the previous statusbar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(sb1 == 0); + + mw.setStatusBar(sb2); + QVERIFY(mw.statusBar() != 0); + QCOMPARE(mw.statusBar(), (QStatusBar *)sb2); + QCOMPARE(sb2->parentWidget(), (QWidget *)&mw); + + mw.setStatusBar(0); + QVERIFY(mw.statusBar() != 0); + //we now call deleteLater on the previous statusbar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(sb2 == 0); + + sb1 = new QStatusBar; + mw.setStatusBar(sb1); + QVERIFY(mw.statusBar() != 0); + QCOMPARE(mw.statusBar(), (QStatusBar *)sb1); + QCOMPARE(sb1->parentWidget(), (QWidget *)&mw); + + sb2 = new QStatusBar; + mw.setStatusBar(sb2); + QVERIFY(mw.statusBar() != 0); + QCOMPARE(mw.statusBar(), (QStatusBar *)sb2); + QCOMPARE(sb2->parentWidget(), (QWidget *)&mw); + //we now call deleteLater on the previous statusbar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(sb1 == 0); + + sb1 = new QStatusBar; + mw.setStatusBar(sb1); + QVERIFY(mw.statusBar() != 0); + QCOMPARE(mw.statusBar(), (QStatusBar *)sb1); + QCOMPARE(sb1->parentWidget(), (QWidget *)&mw); + //we now call deleteLater on the previous statusbar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(sb2 == 0); + + sb2 = new QStatusBar; + mw.setStatusBar(sb2); + QVERIFY(mw.statusBar() != 0); + QCOMPARE(mw.statusBar(), (QStatusBar *)sb2); + QCOMPARE(sb2->parentWidget(), (QWidget *)&mw); + //we now call deleteLater on the previous statusbar + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(sb1 == 0); + } + + { + // deleting the status bar should remove it from the main window + QMainWindow mw; + QStatusBar *sb = mw.statusBar(); + QMainWindowLayout *l = qFindChild(&mw); + QVERIFY(l); + int indexOfSb = l->indexOf(sb); + QVERIFY(indexOfSb != -1); + delete sb; + indexOfSb = l->indexOf(sb); + QVERIFY(indexOfSb == -1); + } +} + +void tst_QMainWindow::centralWidget() +{ + { + QMainWindow mw; + QVERIFY(mw.centralWidget() == 0); + } + + { + QMainWindow mw; + QPointer w1 = new QWidget; + QPointer w2 = new QWidget; + + QVERIFY(mw.centralWidget() == 0); + + mw.setCentralWidget(w1); + QVERIFY(mw.centralWidget() != 0); + QCOMPARE(mw.centralWidget(), (QWidget *)w1); + QCOMPARE(w1->parentWidget(), (QWidget *)&mw); + + mw.setCentralWidget(w2); + QVERIFY(mw.centralWidget() != 0); + QCOMPARE(mw.centralWidget(), (QWidget *)w2); + QCOMPARE(w2->parentWidget(), (QWidget *)&mw); + + mw.setCentralWidget(0); + QVERIFY(mw.centralWidget() == 0); + + //we now call deleteLater on the previous central widgets + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(w1 == 0); + QVERIFY(w2 == 0); + } + + { + // do it again, this time with the mainwindow shown, since + // this tends will activate the layout when setting the new + // central widget + + QMainWindow mw; + mw.show(); + + QPointer w1 = new QWidget; + QPointer w2 = new QWidget; + + QVERIFY(mw.centralWidget() == 0); + + mw.setCentralWidget(w1); + QVERIFY(mw.centralWidget() != 0); + QCOMPARE(mw.centralWidget(), (QWidget *)w1); + QCOMPARE(w1->parentWidget(), (QWidget *)&mw); + + mw.setCentralWidget(w2); + QVERIFY(mw.centralWidget() != 0); + QCOMPARE(mw.centralWidget(), (QWidget *)w2); + QCOMPARE(w2->parentWidget(), (QWidget *)&mw); + + mw.setCentralWidget(0); + QVERIFY(mw.centralWidget() == 0); + + //we now call deleteLater on the previous central widgets + QCoreApplication::sendPostedEvents(0, QEvent::DeferredDelete); + QVERIFY(w1 == 0); + QVERIFY(w2 == 0); + } +} + +void tst_QMainWindow::corner() +{ + { + QMainWindow mw; + + QCOMPARE(mw.corner(Qt::TopLeftCorner), Qt::TopDockWidgetArea); + QCOMPARE(mw.corner(Qt::TopRightCorner), Qt::TopDockWidgetArea); + QCOMPARE(mw.corner(Qt::BottomLeftCorner), Qt::BottomDockWidgetArea); + QCOMPARE(mw.corner(Qt::BottomRightCorner), Qt::BottomDockWidgetArea); + } + + { + QMainWindow mw; + + mw.setCorner(Qt::TopLeftCorner, Qt::LeftDockWidgetArea); + QCOMPARE(mw.corner(Qt::TopLeftCorner), Qt::LeftDockWidgetArea); + mw.setCorner(Qt::TopLeftCorner, Qt::TopDockWidgetArea); + QCOMPARE(mw.corner(Qt::TopLeftCorner), Qt::TopDockWidgetArea); + + mw.setCorner(Qt::TopRightCorner, Qt::RightDockWidgetArea); + QCOMPARE(mw.corner(Qt::TopRightCorner), Qt::RightDockWidgetArea); + mw.setCorner(Qt::TopRightCorner, Qt::TopDockWidgetArea); + QCOMPARE(mw.corner(Qt::TopRightCorner), Qt::TopDockWidgetArea); + + mw.setCorner(Qt::BottomLeftCorner, Qt::LeftDockWidgetArea); + QCOMPARE(mw.corner(Qt::BottomLeftCorner), Qt::LeftDockWidgetArea); + mw.setCorner(Qt::BottomLeftCorner, Qt::BottomDockWidgetArea); + QCOMPARE(mw.corner(Qt::BottomLeftCorner), Qt::BottomDockWidgetArea); + + mw.setCorner(Qt::BottomRightCorner, Qt::RightDockWidgetArea); + QCOMPARE(mw.corner(Qt::BottomRightCorner), Qt::RightDockWidgetArea); + mw.setCorner(Qt::BottomRightCorner, Qt::BottomDockWidgetArea); + QCOMPARE(mw.corner(Qt::BottomRightCorner), Qt::BottomDockWidgetArea); + } +} + +void tst_QMainWindow::addToolBarBreak() +{ + { + QMainWindow mw; + QToolBar tb1(&mw); + mw.addToolBar(Qt::TopToolBarArea, &tb1); + mw.addToolBarBreak(Qt::TopToolBarArea); + QToolBar tb2(&mw); + mw.addToolBar(Qt::TopToolBarArea, &tb2); + mw.addToolBarBreak(Qt::TopToolBarArea); + QToolBar tb3(&mw); + mw.addToolBar(Qt::TopToolBarArea, &tb3); + mw.addToolBarBreak(Qt::TopToolBarArea); + QToolBar tb4(&mw); + mw.addToolBar(Qt::TopToolBarArea, &tb4); + + mw.layout()->invalidate(); + mw.layout()->activate(); + + QCOMPARE(tb1.x(), 0); + QCOMPARE(tb1.y(), 0); + QCOMPARE(tb2.x(), 0); + QVERIFY(tb1.y() != tb2.y()); + QCOMPARE(tb3.x(), 0); + QVERIFY(tb2.y() != tb3.y()); + QCOMPARE(tb4.x(), 0); + QVERIFY(tb3.y() != tb4.y()); + } + + { + QMainWindow mw; + // should not crash, should get a warning instead + QTest::ignoreMessage(QtWarningMsg, "QMainWindow::addToolBarBreak: invalid 'area' argument"); + mw.addToolBarBreak(Qt::NoToolBarArea); + } +} + +void tst_QMainWindow::insertToolBarBreak() +{ + QMainWindow mw; + QToolBar tb1(&mw); + mw.addToolBar(Qt::TopToolBarArea, &tb1); + QToolBar tb2(&mw); + mw.addToolBar(Qt::TopToolBarArea, &tb2); + QToolBar tb3(&mw); + mw.addToolBar(Qt::TopToolBarArea, &tb3); + QToolBar tb4(&mw); + mw.addToolBar(Qt::TopToolBarArea, &tb4); + + mw.insertToolBarBreak(&tb2); + mw.insertToolBarBreak(&tb3); + mw.insertToolBarBreak(&tb4); + + mw.layout()->invalidate(); + mw.layout()->activate(); + + QCOMPARE(tb1.x(), 0); + QCOMPARE(tb1.y(), 0); + QCOMPARE(tb2.x(), 0); + QVERIFY(tb1.y() != tb2.y()); + QCOMPARE(tb3.x(), 0); + QVERIFY(tb2.y() != tb3.y()); + QCOMPARE(tb4.x(), 0); + QVERIFY(tb3.y() != tb4.y()); + + QVERIFY(!mw.toolBarBreak(&tb1)); + QVERIFY(mw.toolBarBreak(&tb4)); + mw.removeToolBarBreak(&tb4); + QVERIFY(!mw.toolBarBreak(&tb4)); + +} + +static bool findWidgetRecursively(QLayoutItem *li, QWidget *w) +{ + QLayout *lay = li->layout(); + if (!lay) + return false; + int i = 0; + QLayoutItem *child; + while ((child = lay->itemAt(i))) { + if (child->widget() == w) { + return true; + } else if (findWidgetRecursively(child, w)) { + return true; + } else { + ++i; + } + } + return false; +} + +void tst_QMainWindow::addToolBar() +{ + Qt::ToolBarArea areas[] = { + Qt::LeftToolBarArea, + Qt::RightToolBarArea, + Qt::TopToolBarArea, + Qt::BottomToolBarArea + }; + const int areaCount = sizeof(areas) / sizeof(Qt::ToolBarArea); + + for (int i = 0; i < areaCount; ++i) { + Qt::ToolBarArea area = areas[i]; + + QMainWindow mw; + QToolBar tb(&mw); + QVERIFY(!findWidgetRecursively(mw.layout(), &tb)); + mw.addToolBar(area, &tb); + QVERIFY(findWidgetRecursively(mw.layout(), &tb)); + } + + { + // addToolBar() with no area, equivalent to top + QMainWindow mw; + QToolBar tb(&mw); + QVERIFY(!findWidgetRecursively(mw.layout(), &tb)); + mw.addToolBar(&tb); + QVERIFY(findWidgetRecursively(mw.layout(), &tb)); + } + + { + QMainWindow mw; + QToolBar tb(&mw); + // should not crash, should get a warning instead + QTest::ignoreMessage(QtWarningMsg, "QMainWindow::addToolBar: invalid 'area' argument"); + mw.addToolBar(Qt::NoToolBarArea, &tb); + } +} + +void tst_QMainWindow::insertToolBar() +{ + Qt::ToolBarArea areas[] = { + Qt::LeftToolBarArea, + Qt::RightToolBarArea, + Qt::TopToolBarArea, + Qt::BottomToolBarArea + }; + const int areaCount = sizeof(areas) / sizeof(Qt::ToolBarArea); + + for (int i = 0; i < areaCount; ++i) { + Qt::ToolBarArea area = areas[i]; + + QMainWindow mw; + QToolBar tb1(&mw); + mw.addToolBar(area, &tb1); + QToolBar tb2(&mw); + mw.insertToolBar(&tb1, &tb2); + QVERIFY(findWidgetRecursively(mw.layout(), &tb1)); + QVERIFY(findWidgetRecursively(mw.layout(), &tb2)); + } + + { + QMainWindow window; + QToolBar *bar1 = new QToolBar(QObject::tr("bar1"), &window); + bar1->addWidget(new QPushButton(QObject::tr("bar1"))); + QToolBar *bar2 = new QToolBar(QLatin1String("bar2")); + bar2->addWidget(new QPushButton(QLatin1String("bar2"))); + QToolBar *bar3 = new QToolBar(QLatin1String("bar3")); + bar3->addWidget(new QPushButton(QLatin1String("bar3"))); + + window.addToolBar(bar1); + window.addToolBar(bar3); + window.insertToolBar(bar1,bar2); + window.insertToolBar(bar1, bar3); + + QVERIFY(!window.isVisible()); + QVERIFY(!bar1->isVisible()); + QVERIFY(!bar2->isVisible()); + QVERIFY(!bar3->isVisible()); + + window.show(); + + QVERIFY(window.isVisible()); + QVERIFY(bar1->isVisible()); + QVERIFY(bar2->isVisible()); + QVERIFY(bar3->isVisible()); + } +} + +void tst_QMainWindow::removeToolBar() +{ + Qt::ToolBarArea areas[] = { + Qt::LeftToolBarArea, + Qt::RightToolBarArea, + Qt::TopToolBarArea, + Qt::BottomToolBarArea + }; + const int areaCount = sizeof(areas) / sizeof(Qt::ToolBarArea); + + for (int i = 0; i < areaCount; ++i) { + Qt::ToolBarArea area = areas[i]; + + QMainWindow mw; + QToolBar tb1(&mw); + mw.addToolBar(area, &tb1); + QToolBar tb2(&mw); + mw.insertToolBar(&tb1, &tb2); + QVERIFY(findWidgetRecursively(mw.layout(), &tb1)); + QVERIFY(findWidgetRecursively(mw.layout(), &tb2)); + + mw.removeToolBar(&tb1); + QVERIFY(!findWidgetRecursively(mw.layout(), &tb1)); + QVERIFY(findWidgetRecursively(mw.layout(), &tb2)); + + mw.removeToolBar(&tb2); + QVERIFY(!findWidgetRecursively(mw.layout(), &tb1)); + QVERIFY(!findWidgetRecursively(mw.layout(), &tb2)); + } +} + +void tst_QMainWindow::toolBarArea() +{ + Qt::ToolBarArea areas[] = { + Qt::LeftToolBarArea, + Qt::RightToolBarArea, + Qt::TopToolBarArea, + Qt::BottomToolBarArea + }; + const int areaCount = sizeof(areas) / sizeof(Qt::ToolBarArea); + + for (int i = 0; i < areaCount; ++i) { + Qt::ToolBarArea area = areas[i]; + + QMainWindow mw; + QToolBar tb(&mw); + + for (int j = 0; j < areaCount; ++j) { + Qt::ToolBarArea otherArea = areas[j]; + + mw.addToolBar(area, &tb); + QCOMPARE(mw.toolBarArea(&tb), area); + mw.addToolBar(otherArea, &tb); + QCOMPARE(mw.toolBarArea(&tb), otherArea); + } + } + + { + // addToolBar() with no area, equivalent to top + QMainWindow mw; + QToolBar tb(&mw); + + for (int j = 0; j < areaCount; ++j) { + Qt::ToolBarArea otherArea = areas[j]; + + mw.addToolBar(&tb); + QCOMPARE(mw.toolBarArea(&tb), Qt::TopToolBarArea); + mw.addToolBar(otherArea, &tb); + QCOMPARE(mw.toolBarArea(&tb), otherArea); + } + } +} + +void tst_QMainWindow::addDockWidget() +{ + Qt::DockWidgetArea areas[] = { + Qt::LeftDockWidgetArea, + Qt::RightDockWidgetArea, + Qt::TopDockWidgetArea, + Qt::BottomDockWidgetArea + }; + const int areaCount = sizeof(areas) / sizeof(Qt::DockWidgetArea); + + for (int i = 0; i < areaCount; ++i) { + Qt::DockWidgetArea area = areas[i]; + + QMainWindow mw; + QDockWidget dw(&mw); + QVERIFY(!findWidgetRecursively(mw.layout(), &dw)); + mw.addDockWidget(area, &dw); + QVERIFY(findWidgetRecursively(mw.layout(), &dw)); + } + + for (int i = 0; i < areaCount; ++i) { + Qt::DockWidgetArea area = areas[i]; + + { + QMainWindow mw; + QDockWidget dw(&mw); + QVERIFY(!findWidgetRecursively(mw.layout(), &dw)); + mw.addDockWidget(area, &dw, Qt::Horizontal); + QVERIFY(findWidgetRecursively(mw.layout(), &dw)); + } + + { + QMainWindow mw; + QDockWidget dw(&mw); + QVERIFY(!findWidgetRecursively(mw.layout(), &dw)); + mw.addDockWidget(area, &dw, Qt::Vertical); + QVERIFY(findWidgetRecursively(mw.layout(), &dw)); + } + } + + { + QMainWindow mw; + QDockWidget dw(&mw); + // should not crash, should get a warning instead + QTest::ignoreMessage(QtWarningMsg, "QMainWindow::addDockWidget: invalid 'area' argument"); + mw.addDockWidget(Qt::NoDockWidgetArea, &dw); + } +} + +void tst_QMainWindow::splitDockWidget() +{ + Qt::DockWidgetArea areas[] = { + Qt::LeftDockWidgetArea, + Qt::RightDockWidgetArea, + Qt::TopDockWidgetArea, + Qt::BottomDockWidgetArea + }; + const int areaCount = sizeof(areas) / sizeof(Qt::DockWidgetArea); + + for (int i = 0; i < areaCount; ++i) { + Qt::DockWidgetArea area = areas[i]; + + { + QMainWindow mw; + QDockWidget dw1(&mw); + QVERIFY(!findWidgetRecursively(mw.layout(), &dw1)); + mw.addDockWidget(area, &dw1); + QVERIFY(findWidgetRecursively(mw.layout(), &dw1)); + QDockWidget dw2(&mw); + QVERIFY(!findWidgetRecursively(mw.layout(), &dw2)); + mw.splitDockWidget(&dw1, &dw2, Qt::Horizontal); + QVERIFY(findWidgetRecursively(mw.layout(), &dw2)); + } + + { + QMainWindow mw; + QDockWidget dw1(&mw); + QVERIFY(!findWidgetRecursively(mw.layout(), &dw1)); + mw.addDockWidget(area, &dw1); + QVERIFY(findWidgetRecursively(mw.layout(), &dw1)); + QDockWidget dw2(&mw); + QVERIFY(!findWidgetRecursively(mw.layout(), &dw2)); + mw.splitDockWidget(&dw1, &dw2, Qt::Horizontal); + QVERIFY(findWidgetRecursively(mw.layout(), &dw2)); + } + } +} + +void tst_QMainWindow::removeDockWidget() +{ + Qt::DockWidgetArea areas[] = { + Qt::LeftDockWidgetArea, + Qt::RightDockWidgetArea, + Qt::TopDockWidgetArea, + Qt::BottomDockWidgetArea + }; + const int areaCount = sizeof(areas) / sizeof(Qt::DockWidgetArea); + + for (int i = 0; i < areaCount; ++i) { + Qt::DockWidgetArea area = areas[i]; + + QMainWindow mw; + QDockWidget dw1(&mw); + mw.addDockWidget(area, &dw1); + QDockWidget dw2(&mw); + mw.addDockWidget(area, &dw2); + QVERIFY(findWidgetRecursively(mw.layout(), &dw1)); + QVERIFY(findWidgetRecursively(mw.layout(), &dw2)); + + mw.removeDockWidget(&dw1); + QVERIFY(!findWidgetRecursively(mw.layout(), &dw1)); + QVERIFY(findWidgetRecursively(mw.layout(), &dw2)); + + mw.removeDockWidget(&dw2); + QVERIFY(!findWidgetRecursively(mw.layout(), &dw1)); + QVERIFY(!findWidgetRecursively(mw.layout(), &dw2)); + } +} + +void tst_QMainWindow::dockWidgetArea() +{ + Qt::DockWidgetArea areas[] = { + Qt::LeftDockWidgetArea, + Qt::RightDockWidgetArea, + Qt::TopDockWidgetArea, + Qt::BottomDockWidgetArea + }; + const int areaCount = sizeof(areas) / sizeof(Qt::DockWidgetArea); + + for (int i = 0; i < areaCount; ++i) { + Qt::DockWidgetArea area = areas[i]; + + QMainWindow mw; + QDockWidget dw(&mw); + + for (int j = 0; j < areaCount; ++j) { + Qt::DockWidgetArea otherArea = areas[i]; + + mw.addDockWidget(area, &dw); + QCOMPARE(mw.dockWidgetArea(&dw), area); + mw.addDockWidget(otherArea, &dw); + QCOMPARE(mw.dockWidgetArea(&dw), otherArea); + } + } +} + +void tst_QMainWindow::restoreState() +{ + QMainWindow mw; + QToolBar tb(&mw); + mw.addToolBar(Qt::TopToolBarArea, &tb); + QDockWidget dw(&mw); + mw.addDockWidget(Qt::LeftDockWidgetArea, &dw); + + QByteArray state; + + state = mw.saveState(); + QVERIFY(mw.restoreState(state)); + + state = mw.saveState(1); + QVERIFY(!mw.restoreState(state)); + QVERIFY(mw.restoreState(state, 1)); +} + +//tests the restoration of the previous versions of window settings +void tst_QMainWindow::restoreStateFromPreviousVersion() +{ + QList restoreData; + restoreData << QByteArray((char*)restoreData41, sizeof(restoreData41)) + << QByteArray((char*)restoreData42, sizeof(restoreData42)) + << QByteArray((char*)restoreData43, sizeof(restoreData43)); + + foreach(QByteArray ba, restoreData) { + + QMainWindow win; + win.setCentralWidget(new QTextEdit); + QVector docks; + + for(int i = 0; i < 16; ++i) { + const QString name = QString::fromLatin1("dock %1").arg(i); + QDockWidget *dock = new QDockWidget(name); + docks += dock; + dock->setObjectName(name); + win.addDockWidget(Qt::TopDockWidgetArea, dock); + } + win.show(); + QCOMPARE(win.restoreState(ba), true); + + for( int i = 0; i < docks.size(); ++i) { + QCOMPARE( win.dockWidgetArea(docks[i]), Qt::DockWidgetArea(1 << i%4)); + } + } + +} + + +void tst_QMainWindow::createPopupMenu() +{ + { + QMainWindow mainwindow; + QVERIFY(!mainwindow.createPopupMenu()); + + QToolBar toolbar1(&mainwindow); + toolbar1.setWindowTitle("toolbar1"); + QToolBar toolbar2(&mainwindow); + toolbar2.setWindowTitle("toolbar2"); + + mainwindow.addToolBar(&toolbar1); + mainwindow.addToolBar(&toolbar2); + + QDockWidget dockwidget1(&mainwindow); + dockwidget1.setWindowTitle("dockwidget1"); + QDockWidget dockwidget2(&mainwindow); + dockwidget2.setWindowTitle("dockwidget2"); + QDockWidget dockwidget3(&mainwindow); + dockwidget3.setWindowTitle("dockwidget3"); + QDockWidget dockwidget4(&mainwindow); + dockwidget4.setWindowTitle("dockwidget4"); + + mainwindow.addDockWidget(Qt::LeftDockWidgetArea, &dockwidget1); + mainwindow.addDockWidget(Qt::LeftDockWidgetArea, &dockwidget2); + mainwindow.addDockWidget(Qt::LeftDockWidgetArea, &dockwidget3); + mainwindow.addDockWidget(Qt::LeftDockWidgetArea, &dockwidget4); + + +#ifdef QT_SOFTKEYS_ENABLED + // Softkeys add extra "Select" and "Back" actions to menu by default. + // Two first actions will be Select and Back when softkeys are enabled + int numSoftkeyActions = 2; +#else + int numSoftkeyActions = 0; +#endif + + QMenu *menu = mainwindow.createPopupMenu(); + QVERIFY(menu != 0); + QList actions = menu->actions(); + QCOMPARE(actions.size(), 7 + numSoftkeyActions); + + QCOMPARE(actions.at(0 + numSoftkeyActions), dockwidget1.toggleViewAction()); + QCOMPARE(actions.at(1 + numSoftkeyActions), dockwidget2.toggleViewAction()); + QCOMPARE(actions.at(2 + numSoftkeyActions), dockwidget3.toggleViewAction()); + QCOMPARE(actions.at(3 + numSoftkeyActions), dockwidget4.toggleViewAction()); + QVERIFY(actions.at(4 + numSoftkeyActions)->isSeparator()); + QCOMPARE(actions.at(5 + numSoftkeyActions), toolbar1.toggleViewAction()); + QCOMPARE(actions.at(6 + numSoftkeyActions), toolbar2.toggleViewAction()); + + delete menu; + + mainwindow.removeToolBar(&toolbar1); + mainwindow.removeDockWidget(&dockwidget1); + mainwindow.removeDockWidget(&dockwidget4); + + menu = mainwindow.createPopupMenu(); + QVERIFY(menu != 0); + actions = menu->actions(); + QCOMPARE(actions.size(), 4 + numSoftkeyActions); + + QCOMPARE(actions.at(0 + numSoftkeyActions), dockwidget2.toggleViewAction()); + QCOMPARE(actions.at(1 + numSoftkeyActions), dockwidget3.toggleViewAction()); + QVERIFY(actions.at(2 + numSoftkeyActions)->isSeparator()); + QCOMPARE(actions.at(3 + numSoftkeyActions), toolbar2.toggleViewAction()); + + delete menu; + } +} + +class MyDockWidget : public QDockWidget +{ +public: + MyDockWidget(QWidget * = 0) { + create(); // otherwise hide() doesn't result in a hide event + } +}; + +class MyWidget : public QWidget +{ +public: + MyWidget(QWidget *parent = 0) : QWidget(parent) + { + } + + QSize sizeHint() const + { + return QSize(200, 200); + } +}; + +void tst_QMainWindow::hideBeforeLayout() +{ + QMainWindow win; + QDockWidget *dock = new MyDockWidget(&win); + dock->setWidget(new QLabel("hello")); + win.addDockWidget(Qt::LeftDockWidgetArea, dock); + dock->hide(); + win.resize(300, 300); + win.show(); + dock->show(); + QVERIFY(dock->geometry().bottomRight().x() >= 0); +} + +struct AddDockWidget +{ + enum Mode { AddMode, SplitMode, TabMode }; + + AddDockWidget() {} + AddDockWidget(const QString &_name, Qt::DockWidgetArea _a) + : name(_name), mode(AddMode), a(_a) {} + AddDockWidget(const QString &_name, const QString &_other, Qt::Orientation _o) + : name(_name), mode(SplitMode), o(_o), other(_other) {} + AddDockWidget(const QString &_name, const QString &_other) + : name(_name), mode(TabMode), other(_other) {} + + QString name; + Mode mode; + + Qt::Orientation o; + Qt::DockWidgetArea a; + QString other; + + void apply(QMainWindow *mw) const; +}; + +typedef QList AddList; +Q_DECLARE_METATYPE(AddList) + +void AddDockWidget::apply(QMainWindow *mw) const +{ + QDockWidget *dw = new QDockWidget(); + QWidget *w = new QWidget(); + w->setMinimumSize(100, 50); + dw->setWidget(w); + + dw->setObjectName(name); + dw->setWindowTitle(name); + + QDockWidget *other = 0; + if (mode == SplitMode || mode == TabMode) { + other = qFindChild(mw, this->other); + QVERIFY(other != 0); + } + + switch (mode) { + case AddMode: + mw->addDockWidget(a, dw); + break; + case SplitMode: + mw->splitDockWidget(other, dw, o); + break; + case TabMode: + mw->tabifyDockWidget(other, dw); + break; + } +} + +#ifdef QT_BUILD_INTERNAL +struct MoveSeparator +{ + MoveSeparator() {} + MoveSeparator(int _delta, const QString &_name) + : delta(_delta), name(_name) {} + MoveSeparator(int _delta, int _area) + : delta(_delta), area(_area) {} + + int delta; + int area; + QString name; + + void apply(QMainWindow *mw) const; +}; + +typedef QList MoveList; +Q_DECLARE_METATYPE(MoveList) + +void MoveSeparator::apply(QMainWindow *mw) const +{ + QMainWindowLayout *l = qFindChild(mw); + QVERIFY(l); + + QList path; + if (name.isEmpty()) { + path << area; + } else { + QDockWidget *dw = qFindChild(mw, name); + QVERIFY(dw != 0); + path = l->layoutState.dockAreaLayout.indexOf(dw); + } + QVERIFY(!path.isEmpty()); + + l->layoutState.dockAreaLayout.separatorMove(path, QPoint(0, 0), QPoint(delta, delta)); +} +#endif + +QMap dockWidgetGeometries(QMainWindow *mw) +{ + QMap result; + QList dockWidgets = qFindChildren(mw); + foreach (QDockWidget *dw, dockWidgets) + result.insert(dw->objectName(), dw->geometry()); + return result; +} + +#define COMPARE_DOCK_WIDGET_GEOS(_oldGeos, _newGeos) \ +{ \ + QMap __oldGeos = _oldGeos; \ + QMap __newGeos = _newGeos; \ + QCOMPARE(__newGeos.keys(), __oldGeos.keys()); \ + QStringList __keys = __newGeos.keys(); \ + foreach (const QString &key, __keys) { \ + QRect __r1 = __oldGeos[key]; \ + QRect __r2 = __newGeos[key]; \ + if (__r1 != __r2) \ + qWarning() << key << __r1 << __r2; \ + } \ + QCOMPARE(__newGeos, __oldGeos); \ +} + +void tst_QMainWindow::saveRestore_data() +{ +#ifdef QT_BUILD_INTERNAL + QTest::addColumn("addList"); + QTest::addColumn("moveList"); + + QTest::newRow("1") << (AddList() + << AddDockWidget("left", Qt::LeftDockWidgetArea)) + << (MoveList() + << MoveSeparator(100, QInternal::LeftDock)); + + QTest::newRow("2") << (AddList() + << AddDockWidget("left", Qt::LeftDockWidgetArea) + << AddDockWidget("right", Qt::RightDockWidgetArea)) + << (MoveList() + << MoveSeparator(70, QInternal::LeftDock) + << MoveSeparator(-40, QInternal::RightDock)); + QTest::newRow("3") << (AddList() + << AddDockWidget("left", Qt::LeftDockWidgetArea) + << AddDockWidget("right1", Qt::RightDockWidgetArea) + << AddDockWidget("right2", Qt::RightDockWidgetArea)) + << (MoveList() + << MoveSeparator(70, QInternal::LeftDock) + << MoveSeparator(-40, QInternal::RightDock)); + + QTest::newRow("4") << (AddList() + << AddDockWidget("left", Qt::LeftDockWidgetArea) + << AddDockWidget("right1", Qt::RightDockWidgetArea) + << AddDockWidget("right2a", Qt::RightDockWidgetArea) + << AddDockWidget("right2b", "right2a", Qt::Horizontal) + ) + << (MoveList() + << MoveSeparator(70, QInternal::LeftDock) + << MoveSeparator(-40, QInternal::RightDock) + << MoveSeparator(-30, "right1") + << MoveSeparator(30, "right2a") + ); +#endif +} + +void tst_QMainWindow::saveRestore() +{ +#ifdef QT_BUILD_INTERNAL + QFETCH(AddList, addList); + QFETCH(MoveList, moveList); + + QByteArray stateData; + QMap dockWidgetGeos; + QSize size; + + { + QMainWindow mainWindow; + mainWindow.setDockNestingEnabled(true); + QTextEdit centralWidget("The rain in Spain falls mainly on the plains"); + mainWindow.setCentralWidget(¢ralWidget); + + foreach (const AddDockWidget &adw, addList) + adw.apply(&mainWindow); + + mainWindow.show(); + + foreach (const MoveSeparator &ms, moveList) + ms.apply(&mainWindow); + + dockWidgetGeos = dockWidgetGeometries(&mainWindow); + size = mainWindow.size(); + stateData = mainWindow.saveState(); + + mainWindow.layout()->setGeometry(mainWindow.rect()); + COMPARE_DOCK_WIDGET_GEOS(dockWidgetGeos, dockWidgetGeometries(&mainWindow)); + +#if 0 + QEventLoop eventLoop; + QPushButton quitButton("Quit", ¢ralWidget); + quitButton.setGeometry(0, 0, 100, 40); + connect(&quitButton, SIGNAL(clicked()), &eventLoop, SLOT(quit())); + quitButton.show(); + eventLoop.exec(); +#endif + } + + // restoreState() after show + { + QMainWindow mainWindow; + mainWindow.setDockNestingEnabled(true); + QTextEdit centralWidget("The rain in Spain falls mainly on the plains"); + mainWindow.setCentralWidget(¢ralWidget); + + foreach (const AddDockWidget &adw, addList) + adw.apply(&mainWindow); + + mainWindow.show(); + mainWindow.restoreState(stateData); + + COMPARE_DOCK_WIDGET_GEOS(dockWidgetGeos, dockWidgetGeometries(&mainWindow)); + } + + // restoreState() before show + { + QMainWindow mainWindow; + mainWindow.setDockNestingEnabled(true); + QTextEdit centralWidget("The rain in Spain falls mainly on the plains"); + mainWindow.setCentralWidget(¢ralWidget); + + foreach (const AddDockWidget &adw, addList) + adw.apply(&mainWindow); + mainWindow.resize(size); + mainWindow.restoreState(stateData); + + mainWindow.show(); + COMPARE_DOCK_WIDGET_GEOS(dockWidgetGeos, dockWidgetGeometries(&mainWindow)); + } +#endif +} + +void tst_QMainWindow::isSeparator() +{ + QMainWindow mw; + QDockWidget *dockw = new QDockWidget(); + mw.addDockWidget(Qt::LeftDockWidgetArea, dockw); + mw.addDockWidget(Qt::LeftDockWidgetArea, new QDockWidget()); + dockw->resize(10,10); + mw.show(); + + //In case the separator size is 1, we increase it to 3 inside the QMainWindow class + const int margin = mw.style()->pixelMetric(QStyle::PM_DockWidgetSeparatorExtent, 0, &mw) == 1 ? 2 : 0; + QVERIFY(!mw.isSeparator(QPoint(4, dockw->pos().y()))); + QVERIFY(!mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height() - 1 - margin))); + QVERIFY( mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height()))); + QVERIFY( mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height() + margin))); + QVERIFY(!mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height() + 15))); + +} + +class MainWindow : public QMainWindow { + public: + using QMainWindow::event; +}; + +#ifndef QT_NO_CURSOR +void tst_QMainWindow::setCursor() +{ + MainWindow mw; + QCursor cur = Qt::WaitCursor; + mw.setCursor(cur); + QCOMPARE(cur.shape(), mw.cursor().shape()); + mw.resize(200,200); + mw.show(); + QTest::qWait(50); + QCOMPARE(cur.shape(), mw.cursor().shape()); + + QHoverEvent enterE(QEvent::HoverEnter, QPoint(10,10), QPoint()); + mw.event(&enterE); + QTest::qWait(50); + QCOMPARE(cur.shape(), mw.cursor().shape()); + + QHoverEvent leaveE(QEvent::HoverLeave, QPoint(), QPoint()); + mw.event(&leaveE); + QTest::qWait(50); + QCOMPARE(cur.shape(), mw.cursor().shape()); +} +#endif + +void tst_QMainWindow::addToolbarAfterShow() +{ + //this is for task 243119 + QMainWindow mainWindow; + mainWindow.show(); + + QToolBar toolBar; + mainWindow.addToolBar(&toolBar); + QTest::qWait(100); + + QVERIFY(!toolBar.isHidden()); +} + +void tst_QMainWindow::centralWidgetSize() +{ + if(PlatformQuirks::isAutoMaximizing()) + QSKIP("The platform is auto maximizing, so the test makes no sense", SkipAll);; + + QMainWindow mainWindow; + mainWindow.menuBar()->addMenu("menu"); + + MyWidget widget; + mainWindow.setCentralWidget(&widget); + + mainWindow.show(); + QTest::qWait(100); + QCOMPARE(widget.size(), widget.sizeHint()); +} + +void tst_QMainWindow::dockWidgetSize() +{ + QMainWindow mainWindow; + mainWindow.menuBar()->addMenu("menu"); + + MyWidget widget; + mainWindow.setCentralWidget(&widget); + + QDockWidget dock; + dock.setWidget(new MyWidget); + mainWindow.addDockWidget(Qt::TopDockWidgetArea, &dock); + + mainWindow.show(); + QTest::qWait(100); + if (mainWindow.size() == mainWindow.sizeHint()) { + QCOMPARE(widget.size(), widget.sizeHint()); + QCOMPARE(dock.widget()->size(), dock.widget()->sizeHint()); + } else { + //otherwise the screen is too small and the size are irrelevant + } +} + +void tst_QMainWindow::QTBUG2774_stylechange() +{ + + QMainWindow mw; + QDockWidget *dockw = new QDockWidget(); + mw.addDockWidget(Qt::LeftDockWidgetArea, dockw); + mw.addDockWidget(Qt::LeftDockWidgetArea, new QDockWidget()); + QTextEdit *central = new QTextEdit(&mw); + mw.setCentralWidget(central); + dockw->resize(10,10); + mw.show(); + QTest::qWaitForWindowShown(&mw); + int centralOriginalWidth = central->width(); + + QVERIFY(!mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height() - 3))); + QVERIFY( mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height()))); + QVERIFY(!mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height() + 30))); + + + { + QTest::qWait(1000); + mw.setStyleSheet("QMainWindow::separator { width: 50px; height:50px; }"); + QTest::qWait(5000); + QApplication::processEvents(); + QVERIFY(central->width() < centralOriginalWidth); + QVERIFY( mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height()))); + QVERIFY( mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height() + 49))); + } + + { + mw.setStyleSheet("QMainWindow::separator { width: 0px; height: 0px; }"); + QApplication::processEvents(); + QVERIFY(central->width() > centralOriginalWidth); + QVERIFY(!mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height()))); + QVERIFY(!mw.isSeparator(QPoint(4, dockw->pos().y() + dockw->size().height() + 1))); + } +} + +#ifdef Q_OS_MAC +void tst_QMainWindow::toggleUnifiedTitleAndToolBarOnMac() +{ + QMainWindow mw; + QToolBar *tb = new QToolBar; + tb->addAction("Test"); + mw.addToolBar(tb); + mw.setUnifiedTitleAndToolBarOnMac(true); + mw.show(); + QRect frameGeometry = mw.frameGeometry(); + mw.setUnifiedTitleAndToolBarOnMac(false); + QVERIFY(frameGeometry.topLeft() == mw.frameGeometry().topLeft()); + mw.setUnifiedTitleAndToolBarOnMac(true); + QVERIFY(frameGeometry.topLeft() == mw.frameGeometry().topLeft()); +} +#endif + +QTEST_MAIN(tst_QMainWindow) +#include "tst_qmainwindow.moc" -- cgit v1.2.3