author | Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com> |
Fri, 19 Feb 2010 23:40:16 +0200 | |
branch | RCL_3 |
changeset 4 | 3b1da2848fc7 |
parent 0 | 1918ee327afb |
permissions | -rw-r--r-- |
0 | 1 |
/**************************************************************************** |
2 |
** |
|
4
3b1da2848fc7
Revision: 201003
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
0
diff
changeset
|
3 |
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
0 | 4 |
** All rights reserved. |
5 |
** Contact: Nokia Corporation (qt-info@nokia.com) |
|
6 |
** |
|
7 |
** This file is part of the test suite of the Qt Toolkit. |
|
8 |
** |
|
9 |
** $QT_BEGIN_LICENSE:LGPL$ |
|
10 |
** No Commercial Usage |
|
11 |
** This file contains pre-release code and may not be distributed. |
|
12 |
** You may use this file in accordance with the terms and conditions |
|
13 |
** contained in the Technology Preview License Agreement accompanying |
|
14 |
** this package. |
|
15 |
** |
|
16 |
** GNU Lesser General Public License Usage |
|
17 |
** Alternatively, this file may be used under the terms of the GNU Lesser |
|
18 |
** General Public License version 2.1 as published by the Free Software |
|
19 |
** Foundation and appearing in the file LICENSE.LGPL included in the |
|
20 |
** packaging of this file. Please review the following information to |
|
21 |
** ensure the GNU Lesser General Public License version 2.1 requirements |
|
22 |
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. |
|
23 |
** |
|
24 |
** In addition, as a special exception, Nokia gives you certain additional |
|
25 |
** rights. These rights are described in the Nokia Qt LGPL Exception |
|
26 |
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. |
|
27 |
** |
|
28 |
** If you have questions regarding the use of this file, please contact |
|
29 |
** Nokia at qt-info@nokia.com. |
|
30 |
** |
|
31 |
** |
|
32 |
** |
|
33 |
** |
|
34 |
** |
|
35 |
** |
|
36 |
** |
|
37 |
** |
|
38 |
** $QT_END_LICENSE$ |
|
39 |
** |
|
40 |
****************************************************************************/ |
|
41 |
||
42 |
||
43 |
#include <QtTest/QtTest> |
|
44 |
||
45 |
#include <QMdiSubWindow> |
|
46 |
#include <QMdiArea> |
|
47 |
||
48 |
#include <QApplication> |
|
49 |
#include <QMainWindow> |
|
50 |
#include <QMenuBar> |
|
51 |
#include <QPushButton> |
|
52 |
#include <QStyle> |
|
53 |
#include <QStyleOption> |
|
54 |
#include <QVBoxLayout> |
|
55 |
#include <QLineEdit> |
|
56 |
#include <QDesktopWidget> |
|
57 |
#include <QDockWidget> |
|
58 |
#include <QScrollBar> |
|
59 |
#include <QTextEdit> |
|
60 |
#ifndef QT_NO_OPENGL |
|
61 |
#include <QtOpenGL> |
|
62 |
#endif |
|
63 |
#include <QMacStyle> |
|
64 |
||
65 |
#include "../../shared/util.h" |
|
66 |
||
67 |
static const Qt::WindowFlags DefaultWindowFlags |
|
68 |
= Qt::SubWindow | Qt::WindowSystemMenuHint |
|
69 |
| Qt::WindowTitleHint | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint; |
|
70 |
||
71 |
Q_DECLARE_METATYPE(QMdiArea::WindowOrder) |
|
72 |
Q_DECLARE_METATYPE(QMdiSubWindow *) |
|
73 |
Q_DECLARE_METATYPE(QList<int>) |
|
74 |
Q_DECLARE_METATYPE(QTabWidget::TabPosition) |
|
75 |
||
76 |
//TESTED_CLASS= |
|
77 |
//TESTED_FILES= |
|
78 |
||
79 |
static bool tabBetweenSubWindowsIn(QMdiArea *mdiArea, int tabCount = -1, bool reverse = false) |
|
80 |
{ |
|
81 |
if (!mdiArea) { |
|
82 |
qWarning("Null pointer to mdi area"); |
|
83 |
return false; |
|
84 |
} |
|
85 |
||
86 |
QList<QMdiSubWindow *> subWindows = mdiArea->subWindowList(); |
|
87 |
const bool walkThrough = tabCount == -1; |
|
88 |
||
89 |
if (walkThrough) { |
|
90 |
QMdiSubWindow *active = reverse ? subWindows.front() : subWindows.back(); |
|
91 |
mdiArea->setActiveSubWindow(active); |
|
92 |
if (mdiArea->activeSubWindow() != active) { |
|
93 |
qWarning("Failed to set active sub window"); |
|
94 |
return false; |
|
95 |
} |
|
96 |
tabCount = subWindows.size(); |
|
97 |
} |
|
98 |
||
99 |
QWidget *focusWidget = qApp->focusWidget(); |
|
100 |
if (!focusWidget) { |
|
101 |
qWarning("No focus widget"); |
|
102 |
return false; |
|
103 |
} |
|
104 |
||
105 |
Qt::KeyboardModifiers modifiers = reverse ? Qt::ShiftModifier : Qt::NoModifier; |
|
106 |
Qt::Key key; |
|
107 |
#ifdef Q_WS_MAC |
|
108 |
key = Qt::Key_Meta; |
|
109 |
modifiers |= Qt::MetaModifier; |
|
110 |
#else |
|
111 |
key = Qt::Key_Control; |
|
112 |
modifiers |= Qt::ControlModifier; |
|
113 |
#endif |
|
114 |
||
115 |
QTest::keyPress(focusWidget, key, modifiers); |
|
116 |
for (int i = 0; i < tabCount; ++i) { |
|
117 |
QTest::keyPress(focusWidget, reverse ? Qt::Key_Backtab : Qt::Key_Tab, modifiers); |
|
118 |
if (tabCount > 1) |
|
119 |
QTest::qWait(500); |
|
120 |
if (walkThrough) { |
|
121 |
QRubberBand *rubberBand = qFindChild<QRubberBand *>(mdiArea->viewport()); |
|
122 |
if (!rubberBand) { |
|
123 |
qWarning("No rubber band"); |
|
124 |
return false; |
|
125 |
} |
|
126 |
QMdiSubWindow *subWindow = subWindows.at(reverse ? subWindows.size() -1 - i : i); |
|
127 |
if (rubberBand->geometry() != subWindow->geometry()) { |
|
128 |
qWarning("Rubber band has different geometry"); |
|
129 |
return false; |
|
130 |
} |
|
131 |
} |
|
132 |
qApp->processEvents(); |
|
133 |
} |
|
134 |
QTest::keyRelease(focusWidget, key); |
|
135 |
||
136 |
return true; |
|
137 |
} |
|
138 |
||
139 |
static inline QTabBar::Shape tabBarShapeFrom(QTabWidget::TabShape shape, QTabWidget::TabPosition position) |
|
140 |
{ |
|
141 |
const bool rounded = (shape == QTabWidget::Rounded); |
|
142 |
if (position == QTabWidget::North) |
|
143 |
return rounded ? QTabBar::RoundedNorth : QTabBar::TriangularNorth; |
|
144 |
if (position == QTabWidget::South) |
|
145 |
return rounded ? QTabBar::RoundedSouth : QTabBar::TriangularSouth; |
|
146 |
if (position == QTabWidget::East) |
|
147 |
return rounded ? QTabBar::RoundedEast : QTabBar::TriangularEast; |
|
148 |
if (position == QTabWidget::West) |
|
149 |
return rounded ? QTabBar::RoundedWest : QTabBar::TriangularWest; |
|
150 |
return QTabBar::RoundedNorth; |
|
151 |
} |
|
152 |
||
153 |
enum Arrangement { |
|
154 |
Tiled, |
|
155 |
Cascaded |
|
156 |
}; |
|
157 |
||
158 |
static bool verifyArrangement(QMdiArea *mdiArea, Arrangement arrangement, const QList<int> &expectedIndices) |
|
159 |
{ |
|
160 |
if (!mdiArea || expectedIndices.isEmpty() || mdiArea->subWindowList().isEmpty()) |
|
161 |
return false; |
|
162 |
||
163 |
const QList<QMdiSubWindow *> subWindows = mdiArea->subWindowList(); |
|
164 |
const QMdiSubWindow *const firstSubWindow = subWindows.at(0); |
|
165 |
||
166 |
switch (arrangement) { |
|
167 |
case Tiled: |
|
168 |
{ |
|
169 |
// Calculate the number of rows and columns. |
|
170 |
const int n = subWindows.count(); |
|
171 |
const int numColumns = qMax(qCeil(qSqrt(qreal(n))), 1); |
|
172 |
const int numRows = qMax((n % numColumns) ? (n / numColumns + 1) : (n / numColumns), 1); |
|
173 |
||
174 |
// Ensure that the geometry of all the subwindows are as expected by using |
|
175 |
// QWidget::childAt starting from the middle of the topleft cell and subsequently |
|
176 |
// adding rowWidth and rowHeight (going from left to right). |
|
177 |
const int columnWidth = mdiArea->viewport()->width() / numColumns; |
|
178 |
const int rowHeight = mdiArea->viewport()->height() / numRows; |
|
179 |
QPoint subWindowPos(columnWidth / 2, rowHeight / 2); |
|
180 |
for (int i = 0; i < numRows; ++i) { |
|
181 |
for (int j = 0; j < numColumns; ++j) { |
|
182 |
const int index = expectedIndices.at(i * numColumns + j); |
|
183 |
QWidget *actual = mdiArea->viewport()->childAt(subWindowPos); |
|
184 |
QMdiSubWindow *expected = subWindows.at(index); |
|
185 |
if (actual != expected && !expected->isAncestorOf(actual)) |
|
186 |
return false; |
|
187 |
subWindowPos.rx() += columnWidth; |
|
188 |
} |
|
189 |
subWindowPos.rx() = columnWidth / 2; |
|
190 |
subWindowPos.ry() += rowHeight; |
|
191 |
} |
|
192 |
break; |
|
193 |
} |
|
194 |
case Cascaded: |
|
195 |
{ |
|
196 |
// Calculate the delta (dx, dy) between two cascaded subwindows. |
|
197 |
QStyleOptionTitleBar options; |
|
198 |
options.initFrom(firstSubWindow); |
|
199 |
int titleBarHeight = firstSubWindow->style()->pixelMetric(QStyle::PM_TitleBarHeight, &options); |
|
200 |
#ifdef Q_WS_MAC |
|
201 |
// ### Remove this after the mac style has been fixed |
|
202 |
if (qobject_cast<QMacStyle *>(firstSubWindow->style())) |
|
203 |
titleBarHeight -= 4; |
|
204 |
#endif |
|
205 |
const QFontMetrics fontMetrics = QFontMetrics(QApplication::font("QWorkspaceTitleBar")); |
|
206 |
const int dy = qMax(titleBarHeight - (titleBarHeight - fontMetrics.height()) / 2, 1); |
|
207 |
const int dx = 10; |
|
208 |
||
209 |
// Current activation/stacking order. |
|
210 |
const QList<QMdiSubWindow *> activationOrderList = mdiArea->subWindowList(QMdiArea::ActivationHistoryOrder); |
|
211 |
||
212 |
// Ensure that the geometry of all the subwindows are as expected by using |
|
213 |
// QWidget::childAt with the position of the first one and subsequently adding |
|
214 |
// dx and dy. |
|
215 |
QPoint subWindowPos(20, 5); |
|
216 |
foreach (int expectedIndex, expectedIndices) { |
|
217 |
QMdiSubWindow *expected = subWindows.at(expectedIndex); |
|
218 |
expected->raise(); |
|
219 |
if (mdiArea->viewport()->childAt(subWindowPos) != expected) |
|
220 |
return false; |
|
221 |
expected->lower(); |
|
222 |
subWindowPos.rx() += dx; |
|
223 |
subWindowPos.ry() += dy; |
|
224 |
} |
|
225 |
||
226 |
// Restore stacking order. |
|
227 |
foreach (QMdiSubWindow *subWindow, activationOrderList) { |
|
228 |
mdiArea->setActiveSubWindow(subWindow); |
|
229 |
qApp->processEvents(); |
|
230 |
} |
|
231 |
break; |
|
232 |
} |
|
233 |
default: |
|
234 |
return false; |
|
235 |
} |
|
236 |
return true; |
|
237 |
} |
|
238 |
||
239 |
class tst_QMdiArea : public QObject |
|
240 |
{ |
|
241 |
Q_OBJECT |
|
242 |
public: |
|
243 |
tst_QMdiArea(); |
|
244 |
public slots: |
|
245 |
void initTestCase(); |
|
246 |
protected slots: |
|
247 |
void activeChanged(QMdiSubWindow *child); |
|
248 |
||
249 |
private slots: |
|
250 |
// Tests from QWorkspace |
|
251 |
void subWindowActivated_data(); |
|
252 |
void subWindowActivated(); |
|
253 |
void subWindowActivated2(); |
|
254 |
void subWindowActivatedWithMinimize(); |
|
255 |
void showWindows(); |
|
256 |
void changeWindowTitle(); |
|
257 |
void changeModified(); |
|
258 |
void childSize(); |
|
259 |
void fixedSize(); |
|
260 |
// New tests |
|
261 |
void minimumSizeHint(); |
|
262 |
void sizeHint(); |
|
263 |
void setActiveSubWindow(); |
|
264 |
void activeSubWindow(); |
|
265 |
void currentSubWindow(); |
|
266 |
void addAndRemoveWindows(); |
|
267 |
void addAndRemoveWindowsWithReparenting(); |
|
268 |
void removeSubWindow_2(); |
|
269 |
void closeWindows(); |
|
270 |
void activateNextAndPreviousWindow(); |
|
271 |
void subWindowList_data(); |
|
272 |
void subWindowList(); |
|
273 |
void setBackground(); |
|
274 |
void setViewport(); |
|
275 |
void tileSubWindows(); |
|
276 |
void cascadeAndTileSubWindows(); |
|
277 |
void resizeMaximizedChildWindows_data(); |
|
278 |
void resizeMaximizedChildWindows(); |
|
279 |
void focusWidgetAfterAddSubWindow(); |
|
280 |
void dontMaximizeSubWindowOnActivation(); |
|
281 |
void delayedPlacement(); |
|
282 |
void iconGeometryInMenuBar(); |
|
283 |
void resizeTimer(); |
|
284 |
void updateScrollBars(); |
|
285 |
void setActivationOrder_data(); |
|
286 |
void setActivationOrder(); |
|
287 |
void tabBetweenSubWindows(); |
|
288 |
void setViewMode(); |
|
289 |
void setTabShape(); |
|
290 |
void setTabPosition_data(); |
|
291 |
void setTabPosition(); |
|
292 |
#if defined(Q_WS_WIN) || defined(Q_WS_X11) |
|
293 |
void nativeSubWindows(); |
|
294 |
#endif |
|
295 |
void task_209615(); |
|
296 |
void task_236750(); |
|
297 |
||
298 |
private: |
|
299 |
QMdiSubWindow *activeWindow; |
|
300 |
bool accelPressed; |
|
301 |
}; |
|
302 |
||
303 |
tst_QMdiArea::tst_QMdiArea() |
|
304 |
: activeWindow(0) |
|
305 |
{ |
|
306 |
qRegisterMetaType<QMdiSubWindow *>(); |
|
307 |
} |
|
308 |
||
309 |
void tst_QMdiArea::initTestCase() |
|
310 |
{ |
|
311 |
#ifdef Q_OS_WINCE //disable magic for WindowsCE |
|
312 |
qApp->setAutoMaximizeThreshold(-1); |
|
313 |
#endif |
|
314 |
} |
|
315 |
||
316 |
// Old QWorkspace tests |
|
317 |
void tst_QMdiArea::activeChanged(QMdiSubWindow *child) |
|
318 |
{ |
|
319 |
activeWindow = child; |
|
320 |
} |
|
321 |
||
322 |
void tst_QMdiArea::subWindowActivated_data() |
|
323 |
{ |
|
324 |
// define the test elements we're going to use |
|
325 |
QTest::addColumn<int>("count"); |
|
326 |
||
327 |
// create a first testdata instance and fill it with data |
|
328 |
QTest::newRow( "data0" ) << 0; |
|
329 |
QTest::newRow( "data1" ) << 1; |
|
330 |
QTest::newRow( "data2" ) << 2; |
|
331 |
} |
|
332 |
||
333 |
void tst_QMdiArea::subWindowActivated() |
|
334 |
{ |
|
335 |
QMainWindow mw(0) ; |
|
336 |
mw.menuBar(); |
|
337 |
QMdiArea *workspace = new QMdiArea(&mw); |
|
338 |
workspace->setObjectName(QLatin1String("testWidget")); |
|
339 |
mw.setCentralWidget(workspace); |
|
340 |
QSignalSpy spy(workspace, SIGNAL(subWindowActivated(QMdiSubWindow *))); |
|
341 |
connect( workspace, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(activeChanged(QMdiSubWindow *))); |
|
342 |
mw.show(); |
|
343 |
qApp->setActiveWindow(&mw); |
|
344 |
||
345 |
QFETCH( int, count ); |
|
346 |
int i; |
|
347 |
||
348 |
for ( i = 0; i < count; ++i ) { |
|
349 |
QWidget *widget = new QWidget(workspace, 0); |
|
350 |
widget->setAttribute(Qt::WA_DeleteOnClose); |
|
351 |
workspace->addSubWindow(widget)->show(); |
|
352 |
widget->show(); |
|
353 |
qApp->processEvents(); |
|
354 |
QVERIFY( activeWindow == workspace->activeSubWindow() ); |
|
355 |
QCOMPARE(spy.count(), 1); |
|
356 |
spy.clear(); |
|
357 |
} |
|
358 |
||
359 |
QList<QMdiSubWindow *> windows = workspace->subWindowList(); |
|
360 |
QCOMPARE( (int)windows.count(), count ); |
|
361 |
||
362 |
for ( i = 0; i < count; ++i ) { |
|
363 |
QMdiSubWindow *window = windows.at(i); |
|
364 |
window->showMinimized(); |
|
365 |
qApp->processEvents(); |
|
366 |
QVERIFY( activeWindow == workspace->activeSubWindow() ); |
|
367 |
if ( i == 1 ) |
|
368 |
QVERIFY( activeWindow == window ); |
|
369 |
} |
|
370 |
||
371 |
for ( i = 0; i < count; ++i ) { |
|
372 |
QMdiSubWindow *window = windows.at(i); |
|
373 |
window->showNormal(); |
|
374 |
qApp->processEvents(); |
|
375 |
QVERIFY( window == activeWindow ); |
|
376 |
QVERIFY( activeWindow == workspace->activeSubWindow() ); |
|
377 |
} |
|
378 |
spy.clear(); |
|
379 |
||
380 |
while (workspace->activeSubWindow() ) { |
|
381 |
workspace->activeSubWindow()->close(); |
|
382 |
qApp->processEvents(); |
|
383 |
QVERIFY(activeWindow == workspace->activeSubWindow()); |
|
384 |
QCOMPARE(spy.count(), 1); |
|
385 |
spy.clear(); |
|
386 |
} |
|
387 |
||
388 |
QVERIFY(activeWindow == 0); |
|
389 |
QVERIFY(workspace->activeSubWindow() == 0); |
|
390 |
QCOMPARE(workspace->subWindowList().count(), 0); |
|
391 |
||
392 |
{ |
|
393 |
workspace->hide(); |
|
394 |
QWidget *widget = new QWidget(workspace); |
|
395 |
widget->setAttribute(Qt::WA_DeleteOnClose); |
|
396 |
QMdiSubWindow *window = workspace->addSubWindow(widget); |
|
397 |
widget->show(); |
|
398 |
QCOMPARE(spy.count(), 0); |
|
399 |
workspace->show(); |
|
400 |
QCOMPARE(spy.count(), 1); |
|
401 |
spy.clear(); |
|
402 |
QVERIFY( activeWindow == window ); |
|
403 |
window->close(); |
|
404 |
qApp->processEvents(); |
|
405 |
QCOMPARE(spy.count(), 1); |
|
406 |
spy.clear(); |
|
407 |
QVERIFY( activeWindow == 0 ); |
|
408 |
} |
|
409 |
||
410 |
{ |
|
411 |
workspace->hide(); |
|
412 |
QWidget *widget = new QWidget(workspace); |
|
413 |
widget->setAttribute(Qt::WA_DeleteOnClose); |
|
414 |
QMdiSubWindow *window = workspace->addSubWindow(widget); |
|
415 |
widget->showMaximized(); |
|
416 |
qApp->sendPostedEvents(); |
|
417 |
QCOMPARE(spy.count(), 0); |
|
418 |
spy.clear(); |
|
419 |
workspace->show(); |
|
420 |
QCOMPARE(spy.count(), 1); |
|
421 |
spy.clear(); |
|
422 |
QVERIFY( activeWindow == window ); |
|
423 |
window->close(); |
|
424 |
qApp->processEvents(); |
|
425 |
QCOMPARE(spy.count(), 1); |
|
426 |
spy.clear(); |
|
427 |
QVERIFY( activeWindow == 0 ); |
|
428 |
} |
|
429 |
||
430 |
{ |
|
431 |
QWidget *widget = new QWidget(workspace); |
|
432 |
widget->setAttribute(Qt::WA_DeleteOnClose); |
|
433 |
QMdiSubWindow *window = workspace->addSubWindow(widget); |
|
434 |
widget->showMinimized(); |
|
435 |
QCOMPARE(spy.count(), 1); |
|
436 |
spy.clear(); |
|
437 |
QVERIFY( activeWindow == window ); |
|
438 |
QVERIFY(workspace->activeSubWindow() == window); |
|
439 |
window->close(); |
|
440 |
qApp->processEvents(); |
|
441 |
QCOMPARE(spy.count(), 1); |
|
442 |
spy.clear(); |
|
443 |
QVERIFY(workspace->activeSubWindow() == 0); |
|
444 |
QVERIFY( activeWindow == 0 ); |
|
445 |
} |
|
446 |
} |
|
447 |
||
448 |
#ifdef Q_WS_MAC |
|
449 |
#include <Security/AuthSession.h> |
|
450 |
bool macHasAccessToWindowsServer() |
|
451 |
{ |
|
452 |
SecuritySessionId mySession; |
|
453 |
SessionAttributeBits sessionInfo; |
|
454 |
SessionGetInfo(callerSecuritySession, &mySession, &sessionInfo); |
|
455 |
return (sessionInfo & sessionHasGraphicAccess); |
|
456 |
} |
|
457 |
#endif |
|
458 |
||
459 |
||
460 |
void tst_QMdiArea::subWindowActivated2() |
|
461 |
{ |
|
462 |
QMdiArea mdiArea; |
|
463 |
QSignalSpy spy(&mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow *))); |
|
464 |
for (int i = 0; i < 5; ++i) |
|
465 |
mdiArea.addSubWindow(new QWidget); |
|
466 |
QCOMPARE(spy.count(), 0); |
|
467 |
mdiArea.show(); |
|
468 |
#ifdef Q_WS_X11 |
|
469 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
470 |
#endif |
|
471 |
QTest::qWait(100); |
|
472 |
||
473 |
QTRY_COMPARE(spy.count(), 5); |
|
474 |
QCOMPARE(mdiArea.activeSubWindow(), mdiArea.subWindowList().back()); |
|
475 |
spy.clear(); |
|
476 |
||
477 |
// Just to make sure another widget is on top wrt. stacking order. |
|
478 |
// This will typically become the active window if things are broken. |
|
479 |
QMdiSubWindow *staysOnTopWindow = mdiArea.subWindowList().at(3); |
|
480 |
staysOnTopWindow->setWindowFlags(Qt::WindowStaysOnTopHint); |
|
481 |
mdiArea.setActiveSubWindow(staysOnTopWindow); |
|
482 |
QCOMPARE(spy.count(), 1); |
|
483 |
QCOMPARE(mdiArea.activeSubWindow(), staysOnTopWindow); |
|
484 |
spy.clear(); |
|
485 |
||
486 |
QMdiSubWindow *activeSubWindow = mdiArea.subWindowList().at(2); |
|
487 |
mdiArea.setActiveSubWindow(activeSubWindow); |
|
488 |
QCOMPARE(spy.count(), 1); |
|
489 |
QCOMPARE(mdiArea.activeSubWindow(), activeSubWindow); |
|
490 |
spy.clear(); |
|
491 |
||
492 |
// Check that we only emit _one_ signal and the active window |
|
493 |
// is unchanged after hide/show. |
|
494 |
mdiArea.hide(); |
|
495 |
#ifdef Q_WS_X11 |
|
496 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
497 |
#endif |
|
498 |
QTest::qWait(100); |
|
499 |
QTRY_COMPARE(spy.count(), 1); |
|
500 |
QVERIFY(!mdiArea.activeSubWindow()); |
|
501 |
QCOMPARE(mdiArea.currentSubWindow(), activeSubWindow); |
|
502 |
spy.clear(); |
|
503 |
||
504 |
mdiArea.show(); |
|
505 |
#ifdef Q_WS_X11 |
|
506 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
507 |
#endif |
|
508 |
QTest::qWait(100); |
|
509 |
QTRY_COMPARE(spy.count(), 1); |
|
510 |
QCOMPARE(mdiArea.activeSubWindow(), activeSubWindow); |
|
511 |
spy.clear(); |
|
512 |
||
513 |
// Check that we only emit _one_ signal and the active window |
|
514 |
// is unchanged after showMinimized/showNormal. |
|
515 |
mdiArea.showMinimized(); |
|
516 |
#ifdef Q_WS_X11 |
|
517 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
518 |
#elif defined (Q_WS_MAC) |
|
519 |
if (!macHasAccessToWindowsServer()) |
|
520 |
QEXPECT_FAIL("", "showMinimized doesn't really minimize if you don't have access to the server", Abort); |
|
521 |
#endif |
|
522 |
QTest::qWait(10); |
|
523 |
#if defined(Q_WS_QWS) |
|
524 |
QEXPECT_FAIL("", "task 168682", Abort); |
|
525 |
#endif |
|
526 |
#ifdef Q_OS_WINCE |
|
527 |
QSKIP("Not fixed yet. See Task 197453", SkipAll); |
|
528 |
#endif |
|
529 |
QTRY_COMPARE(spy.count(), 1); |
|
530 |
QVERIFY(!mdiArea.activeSubWindow()); |
|
531 |
QCOMPARE(mdiArea.currentSubWindow(), activeSubWindow); |
|
532 |
spy.clear(); |
|
533 |
||
534 |
mdiArea.showNormal(); |
|
535 |
#ifdef Q_WS_X11 |
|
536 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
537 |
#endif |
|
538 |
QTest::qWait(100); |
|
539 |
QTRY_COMPARE(spy.count(), 1); |
|
540 |
QCOMPARE(mdiArea.activeSubWindow(), activeSubWindow); |
|
541 |
spy.clear(); |
|
542 |
} |
|
543 |
||
544 |
void tst_QMdiArea::subWindowActivatedWithMinimize() |
|
545 |
{ |
|
546 |
QMainWindow mw(0) ; |
|
547 |
mw.menuBar(); |
|
548 |
QMdiArea *workspace = new QMdiArea(&mw); |
|
549 |
workspace->setObjectName(QLatin1String("testWidget")); |
|
550 |
mw.setCentralWidget(workspace); |
|
551 |
QSignalSpy spy(workspace, SIGNAL(subWindowActivated(QMdiSubWindow *))); |
|
552 |
connect( workspace, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(activeChanged(QMdiSubWindow *)) ); |
|
553 |
mw.show(); |
|
554 |
qApp->setActiveWindow(&mw); |
|
555 |
QWidget *widget = new QWidget(workspace); |
|
556 |
widget->setAttribute(Qt::WA_DeleteOnClose); |
|
557 |
QMdiSubWindow *window1 = workspace->addSubWindow(widget); |
|
558 |
QWidget *widget2 = new QWidget(workspace); |
|
559 |
widget2->setAttribute(Qt::WA_DeleteOnClose); |
|
560 |
QMdiSubWindow *window2 = workspace->addSubWindow(widget2); |
|
561 |
||
562 |
widget->showMinimized(); |
|
563 |
QVERIFY( activeWindow == window1 ); |
|
564 |
widget2->showMinimized(); |
|
565 |
QVERIFY( activeWindow == window2 ); |
|
566 |
||
567 |
window2->close(); |
|
568 |
qApp->processEvents(); |
|
569 |
QVERIFY( activeWindow == window1 ); |
|
570 |
||
571 |
window1->close(); |
|
572 |
qApp->processEvents(); |
|
573 |
QVERIFY(workspace->activeSubWindow() == 0); |
|
574 |
QVERIFY( activeWindow == 0 ); |
|
575 |
||
576 |
QVERIFY( workspace->subWindowList().count() == 0 ); |
|
577 |
} |
|
578 |
||
579 |
void tst_QMdiArea::showWindows() |
|
580 |
{ |
|
581 |
QMdiArea *ws = new QMdiArea( 0 ); |
|
582 |
||
583 |
QWidget *widget = 0; |
|
584 |
ws->show(); |
|
585 |
||
586 |
widget = new QWidget(ws); |
|
587 |
widget->show(); |
|
588 |
QVERIFY( widget->isVisible() ); |
|
589 |
||
590 |
widget = new QWidget(ws); |
|
591 |
widget->showMaximized(); |
|
592 |
QVERIFY( widget->isMaximized() ); |
|
593 |
widget->showNormal(); |
|
594 |
QVERIFY( !widget->isMaximized() ); |
|
595 |
||
596 |
widget = new QWidget(ws); |
|
597 |
widget->showMinimized(); |
|
598 |
QVERIFY( widget->isMinimized() ); |
|
599 |
widget->showNormal(); |
|
600 |
QVERIFY( !widget->isMinimized() ); |
|
601 |
||
602 |
ws->hide(); |
|
603 |
||
604 |
widget = new QWidget(ws); |
|
605 |
ws->show(); |
|
606 |
QVERIFY( widget->isVisible() ); |
|
607 |
||
608 |
ws->hide(); |
|
609 |
||
610 |
widget = new QWidget(ws); |
|
611 |
widget->showMaximized(); |
|
612 |
QVERIFY( widget->isMaximized() ); |
|
613 |
ws->show(); |
|
614 |
QVERIFY( widget->isVisible() ); |
|
615 |
QVERIFY( widget->isMaximized() ); |
|
616 |
ws->hide(); |
|
617 |
||
618 |
widget = new QWidget(ws); |
|
619 |
widget->showMinimized(); |
|
620 |
ws->show(); |
|
621 |
QVERIFY( widget->isMinimized() ); |
|
622 |
ws->hide(); |
|
623 |
||
624 |
delete ws; |
|
625 |
} |
|
626 |
||
627 |
||
628 |
//#define USE_SHOW |
|
629 |
||
630 |
void tst_QMdiArea::changeWindowTitle() |
|
631 |
{ |
|
632 |
const QString mwc = QString::fromLatin1("MainWindow's Caption"); |
|
633 |
const QString mwc2 = QString::fromLatin1("MainWindow's New Caption"); |
|
634 |
const QString wc = QString::fromLatin1("Widget's Caption"); |
|
635 |
const QString wc2 = QString::fromLatin1("Widget's New Caption"); |
|
636 |
||
637 |
QMainWindow *mw = new QMainWindow; |
|
638 |
mw->setWindowTitle( mwc ); |
|
639 |
QMdiArea *ws = new QMdiArea( mw ); |
|
640 |
mw->setCentralWidget( ws ); |
|
641 |
mw->menuBar(); |
|
642 |
mw->show(); |
|
643 |
QTest::qWaitForWindowShown(mw); |
|
644 |
||
645 |
QWidget *widget = new QWidget( ws ); |
|
646 |
widget->setWindowTitle( wc ); |
|
647 |
ws->addSubWindow(widget); |
|
648 |
||
649 |
QCOMPARE( mw->windowTitle(), mwc ); |
|
650 |
||
651 |
#ifdef USE_SHOW |
|
652 |
widget->showMaximized(); |
|
653 |
#else |
|
654 |
widget->setWindowState(Qt::WindowMaximized); |
|
655 |
#endif |
|
656 |
#if !defined(Q_WS_MAC) && !defined(Q_OS_WINCE) |
|
657 |
QTRY_COMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc) ); |
|
658 |
#endif |
|
659 |
||
660 |
mw->hide(); |
|
661 |
qApp->processEvents(); |
|
662 |
mw->show(); |
|
663 |
qApp->processEvents(); |
|
664 |
QTest::qWaitForWindowShown(mw); |
|
665 |
||
666 |
#if !defined(Q_WS_MAC) && !defined(Q_OS_WINCE) |
|
667 |
QTRY_COMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc) ); |
|
668 |
#endif |
|
669 |
||
670 |
#ifdef USE_SHOW |
|
671 |
widget->showNormal(); |
|
672 |
#else |
|
673 |
widget->setWindowState(Qt::WindowNoState); |
|
674 |
#endif |
|
675 |
qApp->processEvents(); |
|
676 |
QCOMPARE( mw->windowTitle(), mwc ); |
|
677 |
||
678 |
#ifdef USE_SHOW |
|
679 |
widget->showMaximized(); |
|
680 |
#else |
|
681 |
widget->setWindowState(Qt::WindowMaximized); |
|
682 |
#endif |
|
683 |
qApp->processEvents(); |
|
684 |
#if !defined(Q_WS_MAC) && !defined(Q_OS_WINCE) |
|
685 |
QTRY_COMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc) ); |
|
686 |
widget->setWindowTitle( wc2 ); |
|
687 |
QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc).arg(wc2) ); |
|
688 |
mw->setWindowTitle( mwc2 ); |
|
689 |
QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc2).arg(wc2) ); |
|
690 |
#endif |
|
691 |
||
692 |
mw->show(); |
|
693 |
qApp->setActiveWindow(mw); |
|
694 |
||
695 |
#ifdef USE_SHOW |
|
696 |
mw->showFullScreen(); |
|
697 |
#else |
|
698 |
mw->setWindowState(Qt::WindowFullScreen); |
|
699 |
#endif |
|
700 |
||
701 |
qApp->processEvents(); |
|
702 |
#if !defined(Q_WS_MAC) && !defined(Q_OS_WINCE) |
|
703 |
QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc2).arg(wc2) ); |
|
704 |
#endif |
|
705 |
#ifdef USE_SHOW |
|
706 |
widget->showNormal(); |
|
707 |
#else |
|
708 |
widget->setWindowState(Qt::WindowNoState); |
|
709 |
#endif |
|
710 |
qApp->processEvents(); |
|
711 |
#if defined(Q_WS_MAC) || defined(Q_OS_WINCE) |
|
712 |
QCOMPARE(mw->windowTitle(), mwc); |
|
713 |
#else |
|
714 |
QCOMPARE( mw->windowTitle(), mwc2 ); |
|
715 |
#endif |
|
716 |
||
717 |
#ifdef USE_SHOW |
|
718 |
widget->showMaximized(); |
|
719 |
#else |
|
720 |
widget->setWindowState(Qt::WindowMaximized); |
|
721 |
#endif |
|
722 |
qApp->processEvents(); |
|
723 |
#if !defined(Q_WS_MAC) && !defined(Q_OS_WINCE) |
|
724 |
QCOMPARE( mw->windowTitle(), QString::fromLatin1("%1 - [%2]").arg(mwc2).arg(wc2) ); |
|
725 |
#endif |
|
726 |
||
727 |
#ifdef USE_SHOW |
|
728 |
mw->showNormal(); |
|
729 |
#else |
|
730 |
mw->setWindowState(Qt::WindowNoState); |
|
731 |
#endif |
|
732 |
qApp->processEvents(); |
|
733 |
#ifdef USE_SHOW |
|
734 |
widget->showNormal(); |
|
735 |
#else |
|
736 |
widget->setWindowState(Qt::WindowNoState); |
|
737 |
#endif |
|
738 |
||
739 |
delete mw; |
|
740 |
} |
|
741 |
||
742 |
void tst_QMdiArea::changeModified() |
|
743 |
{ |
|
744 |
const QString mwc = QString::fromLatin1("MainWindow's Caption"); |
|
745 |
const QString wc = QString::fromLatin1("Widget's Caption[*]"); |
|
746 |
||
747 |
QMainWindow *mw = new QMainWindow(0); |
|
748 |
mw->setWindowTitle( mwc ); |
|
749 |
QMdiArea *ws = new QMdiArea( mw ); |
|
750 |
mw->setCentralWidget( ws ); |
|
751 |
mw->menuBar(); |
|
752 |
mw->show(); |
|
753 |
||
754 |
QWidget *widget = new QWidget( ws ); |
|
755 |
widget->setWindowTitle( wc ); |
|
756 |
ws->addSubWindow(widget); |
|
757 |
||
758 |
QCOMPARE( mw->isWindowModified(), false); |
|
759 |
QCOMPARE( widget->isWindowModified(), false); |
|
760 |
widget->setWindowState(Qt::WindowMaximized); |
|
761 |
QCOMPARE( mw->isWindowModified(), false); |
|
762 |
QCOMPARE( widget->isWindowModified(), false); |
|
763 |
||
764 |
widget->setWindowState(Qt::WindowNoState); |
|
765 |
QCOMPARE( mw->isWindowModified(), false); |
|
766 |
QCOMPARE( widget->isWindowModified(), false); |
|
767 |
||
768 |
widget->setWindowModified(true); |
|
769 |
QCOMPARE( mw->isWindowModified(), false); |
|
770 |
QCOMPARE( widget->isWindowModified(), true); |
|
771 |
widget->setWindowState(Qt::WindowMaximized); |
|
772 |
#if !defined(Q_WS_MAC) && !defined(Q_OS_WINCE) |
|
773 |
QCOMPARE( mw->isWindowModified(), true); |
|
774 |
#endif |
|
775 |
QCOMPARE( widget->isWindowModified(), true); |
|
776 |
||
777 |
widget->setWindowState(Qt::WindowNoState); |
|
778 |
QCOMPARE( mw->isWindowModified(), false); |
|
779 |
QCOMPARE( widget->isWindowModified(), true); |
|
780 |
||
781 |
widget->setWindowState(Qt::WindowMaximized); |
|
782 |
#if !defined(Q_WS_MAC) && !defined(Q_OS_WINCE) |
|
783 |
QCOMPARE( mw->isWindowModified(), true); |
|
784 |
#endif |
|
785 |
QCOMPARE( widget->isWindowModified(), true); |
|
786 |
||
787 |
widget->setWindowModified(false); |
|
788 |
QCOMPARE( mw->isWindowModified(), false); |
|
789 |
QCOMPARE( widget->isWindowModified(), false); |
|
790 |
||
791 |
widget->setWindowModified(true); |
|
792 |
#if !defined(Q_WS_MAC) && !defined(Q_OS_WINCE) |
|
793 |
QCOMPARE( mw->isWindowModified(), true); |
|
794 |
#endif |
|
795 |
QCOMPARE( widget->isWindowModified(), true); |
|
796 |
||
797 |
widget->setWindowState(Qt::WindowNoState); |
|
798 |
QCOMPARE( mw->isWindowModified(), false); |
|
799 |
QCOMPARE( widget->isWindowModified(), true); |
|
800 |
||
801 |
delete mw; |
|
802 |
} |
|
803 |
||
804 |
class MyChild : public QWidget |
|
805 |
{ |
|
806 |
public: |
|
807 |
MyChild(QWidget *parent = 0) : QWidget(parent) {} |
|
808 |
QSize sizeHint() const { return QSize(234, 123); } |
|
809 |
}; |
|
810 |
||
811 |
void tst_QMdiArea::childSize() |
|
812 |
{ |
|
813 |
QMdiArea ws; |
|
814 |
||
815 |
MyChild *child = new MyChild(&ws); |
|
816 |
child->show(); |
|
817 |
QCOMPARE(child->size(), child->sizeHint()); |
|
818 |
delete child; |
|
819 |
||
820 |
child = new MyChild(&ws); |
|
821 |
child->setFixedSize(200, 200); |
|
822 |
child->show(); |
|
823 |
QCOMPARE(child->size(), child->minimumSize()); |
|
824 |
delete child; |
|
825 |
||
826 |
child = new MyChild(&ws); |
|
827 |
child->resize(150, 150); |
|
828 |
child->show(); |
|
829 |
QCOMPARE(child->size(), QSize(150,150)); |
|
830 |
delete child; |
|
831 |
} |
|
832 |
||
833 |
void tst_QMdiArea::fixedSize() |
|
834 |
{ |
|
835 |
QMdiArea *ws = new QMdiArea; |
|
836 |
int i; |
|
837 |
||
838 |
ws->resize(500, 500); |
|
839 |
// ws->show(); |
|
840 |
||
841 |
QSize fixed(300, 300); |
|
842 |
for (i = 0; i < 4; ++i) { |
|
843 |
QWidget *child = new QWidget(ws); |
|
844 |
child->setFixedSize(fixed); |
|
845 |
child->show(); |
|
846 |
} |
|
847 |
||
848 |
QList<QMdiSubWindow *> windows = ws->subWindowList(); |
|
849 |
for (i = 0; i < (int)windows.count(); ++i) { |
|
850 |
QMdiSubWindow *child = windows.at(i); |
|
851 |
QCOMPARE(child->size(), fixed); |
|
852 |
} |
|
853 |
||
854 |
ws->cascadeSubWindows(); |
|
855 |
ws->resize(800, 800); |
|
856 |
for (i = 0; i < (int)windows.count(); ++i) { |
|
857 |
QMdiSubWindow *child = windows.at(i); |
|
858 |
QCOMPARE(child->size(), fixed); |
|
859 |
} |
|
860 |
ws->resize(500, 500); |
|
861 |
||
862 |
ws->tileSubWindows(); |
|
863 |
ws->resize(800, 800); |
|
864 |
for (i = 0; i < (int)windows.count(); ++i) { |
|
865 |
QMdiSubWindow *child = windows.at(i); |
|
866 |
QCOMPARE(child->size(), fixed); |
|
867 |
} |
|
868 |
ws->resize(500, 500); |
|
869 |
||
870 |
for (i = 0; i < (int)windows.count(); ++i) { |
|
871 |
QMdiSubWindow *child = windows.at(i); |
|
872 |
delete child; |
|
873 |
} |
|
874 |
||
875 |
delete ws; |
|
876 |
} |
|
877 |
||
878 |
class LargeWidget : public QWidget |
|
879 |
{ |
|
880 |
public: |
|
881 |
LargeWidget(QWidget *parent = 0) : QWidget(parent) {} |
|
882 |
QSize sizeHint() const { return QSize(1280, 1024); } |
|
883 |
QSize minimumSizeHint() const { return QSize(300, 300); } |
|
884 |
}; |
|
885 |
||
886 |
// New tests |
|
887 |
void tst_QMdiArea::minimumSizeHint() |
|
888 |
{ |
|
889 |
QMdiArea workspace; |
|
890 |
workspace.show(); |
|
891 |
QSize expectedSize(workspace.style()->pixelMetric(QStyle::PM_MDIMinimizedWidth), |
|
892 |
workspace.style()->pixelMetric(QStyle::PM_TitleBarHeight)); |
|
893 |
qApp->processEvents(); |
|
894 |
QAbstractScrollArea dummyScrollArea; |
|
895 |
dummyScrollArea.setFrameStyle(QFrame::NoFrame); |
|
896 |
expectedSize = expectedSize.expandedTo(dummyScrollArea.minimumSizeHint()); |
|
897 |
QCOMPARE(workspace.minimumSizeHint(), expectedSize.expandedTo(qApp->globalStrut())); |
|
898 |
||
899 |
QWidget *window = workspace.addSubWindow(new QWidget); |
|
900 |
qApp->processEvents(); |
|
901 |
window->show(); |
|
902 |
QCOMPARE(workspace.minimumSizeHint(), expectedSize.expandedTo(window->minimumSizeHint())); |
|
903 |
||
904 |
QMdiSubWindow *subWindow = workspace.addSubWindow(new LargeWidget); |
|
905 |
subWindow->show(); |
|
906 |
QCOMPARE(workspace.minimumSizeHint(), expectedSize.expandedTo(subWindow->minimumSizeHint())); |
|
907 |
||
908 |
workspace.setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); |
|
909 |
workspace.setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); |
|
910 |
QCOMPARE(workspace.minimumSizeHint(), expectedSize); |
|
911 |
} |
|
912 |
||
913 |
void tst_QMdiArea::sizeHint() |
|
914 |
{ |
|
915 |
QMdiArea workspace; |
|
916 |
workspace.show(); |
|
917 |
QSize desktopSize = QApplication::desktop()->size(); |
|
918 |
QSize expectedSize(desktopSize.width() * 2/3, desktopSize.height() * 2/3); |
|
919 |
QCOMPARE(workspace.sizeHint(), expectedSize.expandedTo(qApp->globalStrut())); |
|
920 |
||
921 |
QWidget *window = workspace.addSubWindow(new QWidget); |
|
922 |
qApp->processEvents(); |
|
923 |
window->show(); |
|
924 |
QCOMPARE(workspace.sizeHint(), expectedSize.expandedTo(window->sizeHint())); |
|
925 |
||
926 |
QMdiSubWindow *nested = workspace.addSubWindow(new QMdiArea); |
|
927 |
expectedSize = QSize(desktopSize.width() * 2/6, desktopSize.height() * 2/6); |
|
928 |
QCOMPARE(nested->widget()->sizeHint(), expectedSize); |
|
929 |
} |
|
930 |
||
931 |
void tst_QMdiArea::setActiveSubWindow() |
|
932 |
{ |
|
933 |
QMdiArea workspace; |
|
934 |
workspace.show(); |
|
935 |
||
936 |
QSignalSpy spy(&workspace, SIGNAL(subWindowActivated(QMdiSubWindow *))); |
|
937 |
connect(&workspace, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(activeChanged(QMdiSubWindow *))); |
|
938 |
qApp->setActiveWindow(&workspace); |
|
939 |
||
940 |
// Activate hidden windows |
|
941 |
const int windowCount = 10; |
|
942 |
QMdiSubWindow *windows[windowCount]; |
|
943 |
for (int i = 0; i < windowCount; ++i) { |
|
944 |
windows[i] = qobject_cast<QMdiSubWindow *>(workspace.addSubWindow(new QWidget)); |
|
945 |
qApp->processEvents(); |
|
946 |
QVERIFY(windows[i]->isHidden()); |
|
947 |
workspace.setActiveSubWindow(windows[i]); |
|
948 |
} |
|
949 |
QCOMPARE(spy.count(), 0); |
|
950 |
QVERIFY(!activeWindow); |
|
951 |
spy.clear(); |
|
952 |
||
953 |
// Activate visible windows |
|
954 |
for (int i = 0; i < windowCount; ++i) { |
|
955 |
windows[i]->show(); |
|
956 |
QVERIFY(!windows[i]->isHidden()); |
|
957 |
workspace.setActiveSubWindow(windows[i]); |
|
958 |
qApp->processEvents(); |
|
959 |
QCOMPARE(spy.count(), 1); |
|
960 |
QCOMPARE(activeWindow, windows[i]); |
|
961 |
spy.clear(); |
|
962 |
} |
|
963 |
||
964 |
// Deactivate active window |
|
965 |
QCOMPARE(workspace.activeSubWindow(), windows[windowCount - 1]); |
|
966 |
workspace.setActiveSubWindow(0); |
|
967 |
QCOMPARE(spy.count(), 1); |
|
968 |
QVERIFY(!activeWindow); |
|
969 |
QVERIFY(!workspace.activeSubWindow()); |
|
970 |
||
971 |
// Activate widget which is not child of any window inside workspace |
|
972 |
QMdiSubWindow fakeWindow; |
|
973 |
QTest::ignoreMessage(QtWarningMsg, "QMdiArea::setActiveSubWindow: window is not inside workspace"); |
|
974 |
workspace.setActiveSubWindow(&fakeWindow); |
|
975 |
||
976 |
} |
|
977 |
||
978 |
void tst_QMdiArea::activeSubWindow() |
|
979 |
{ |
|
980 |
QMainWindow mainWindow; |
|
981 |
||
982 |
QMdiArea *mdiArea = new QMdiArea; |
|
983 |
QLineEdit *subWindowLineEdit = new QLineEdit; |
|
984 |
QMdiSubWindow *subWindow = mdiArea->addSubWindow(subWindowLineEdit); |
|
985 |
mainWindow.setCentralWidget(mdiArea); |
|
986 |
||
987 |
QDockWidget *dockWidget = new QDockWidget(QLatin1String("Dock Widget"), &mainWindow); |
|
988 |
dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea); |
|
989 |
QLineEdit *dockWidgetLineEdit = new QLineEdit; |
|
990 |
dockWidget->setWidget(dockWidgetLineEdit); |
|
991 |
mainWindow.addDockWidget(Qt::LeftDockWidgetArea, dockWidget); |
|
992 |
||
993 |
mainWindow.show(); |
|
994 |
#ifdef Q_WS_X11 |
|
995 |
qt_x11_wait_for_window_manager(&mainWindow); |
|
996 |
#endif |
|
997 |
||
998 |
qApp->setActiveWindow(&mainWindow); |
|
999 |
QCOMPARE(mdiArea->activeSubWindow(), subWindow); |
|
1000 |
QCOMPARE(qApp->focusWidget(), (QWidget *)subWindowLineEdit); |
|
1001 |
||
1002 |
dockWidgetLineEdit->setFocus(); |
|
1003 |
QCOMPARE(qApp->focusWidget(), (QWidget *)dockWidgetLineEdit); |
|
1004 |
QCOMPARE(mdiArea->activeSubWindow(), subWindow); |
|
1005 |
||
1006 |
QEvent deactivateEvent(QEvent::WindowDeactivate); |
|
1007 |
qApp->sendEvent(subWindow, &deactivateEvent); |
|
1008 |
QVERIFY(!mdiArea->activeSubWindow()); |
|
1009 |
QCOMPARE(qApp->focusWidget(), (QWidget *)dockWidgetLineEdit); |
|
1010 |
||
1011 |
QEvent activateEvent(QEvent::WindowActivate); |
|
1012 |
qApp->sendEvent(subWindow, &activateEvent); |
|
1013 |
QCOMPARE(mdiArea->activeSubWindow(), subWindow); |
|
1014 |
QCOMPARE(qApp->focusWidget(), (QWidget *)subWindowLineEdit); |
|
1015 |
||
1016 |
QLineEdit dummyTopLevel; |
|
1017 |
dummyTopLevel.show(); |
|
1018 |
#ifdef Q_WS_X11 |
|
1019 |
qt_x11_wait_for_window_manager(&dummyTopLevel); |
|
1020 |
#endif |
|
1021 |
||
1022 |
qApp->setActiveWindow(&dummyTopLevel); |
|
1023 |
QCOMPARE(mdiArea->activeSubWindow(), subWindow); |
|
1024 |
||
1025 |
qApp->setActiveWindow(&mainWindow); |
|
1026 |
QCOMPARE(mdiArea->activeSubWindow(), subWindow); |
|
1027 |
||
1028 |
#if !defined(Q_WS_MAC) && !defined(Q_WS_WIN) |
|
1029 |
qApp->setActiveWindow(0); |
|
1030 |
QVERIFY(!mdiArea->activeSubWindow()); |
|
1031 |
#endif |
|
1032 |
||
1033 |
//task 202657 |
|
1034 |
dockWidgetLineEdit->setFocus(); |
|
1035 |
qApp->setActiveWindow(&mainWindow); |
|
1036 |
QVERIFY(dockWidgetLineEdit->hasFocus()); |
|
1037 |
} |
|
1038 |
||
1039 |
void tst_QMdiArea::currentSubWindow() |
|
1040 |
{ |
|
1041 |
QMdiArea mdiArea; |
|
1042 |
mdiArea.show(); |
|
1043 |
#ifdef Q_WS_X11 |
|
1044 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
1045 |
#endif |
|
1046 |
||
1047 |
for (int i = 0; i < 5; ++i) |
|
1048 |
mdiArea.addSubWindow(new QLineEdit)->show(); |
|
1049 |
||
1050 |
qApp->setActiveWindow(&mdiArea); |
|
1051 |
QCOMPARE(qApp->activeWindow(), (QWidget *)&mdiArea); |
|
1052 |
||
1053 |
// Check that the last added window is the active and the current. |
|
1054 |
QMdiSubWindow *active = mdiArea.activeSubWindow(); |
|
1055 |
QVERIFY(active); |
|
1056 |
QCOMPARE(mdiArea.subWindowList().back(), active); |
|
1057 |
QCOMPARE(mdiArea.currentSubWindow(), active); |
|
1058 |
||
1059 |
QLineEdit dummyTopLevel; |
|
1060 |
dummyTopLevel.show(); |
|
1061 |
#ifdef Q_WS_X11 |
|
1062 |
qt_x11_wait_for_window_manager(&dummyTopLevel); |
|
1063 |
#endif |
|
1064 |
||
1065 |
// Move focus to another top-level and check that we still |
|
1066 |
// have an active window. |
|
1067 |
qApp->setActiveWindow(&dummyTopLevel); |
|
1068 |
QCOMPARE(qApp->activeWindow(), (QWidget *)&dummyTopLevel); |
|
1069 |
QVERIFY(mdiArea.activeSubWindow()); |
|
1070 |
||
1071 |
delete active; |
|
1072 |
active = 0; |
|
1073 |
||
1074 |
// We just deleted the current sub-window -> current should then |
|
1075 |
// be the next in list (which in this case is the first sub-window). |
|
1076 |
QVERIFY(mdiArea.currentSubWindow()); |
|
1077 |
QCOMPARE(mdiArea.currentSubWindow(), mdiArea.subWindowList().front()); |
|
1078 |
||
1079 |
// Activate mdi area and check that active == current. |
|
1080 |
qApp->setActiveWindow(&mdiArea); |
|
1081 |
active = mdiArea.activeSubWindow(); |
|
1082 |
QVERIFY(active); |
|
1083 |
QCOMPARE(mdiArea.activeSubWindow(), mdiArea.subWindowList().front()); |
|
1084 |
||
1085 |
active->hide(); |
|
1086 |
QCOMPARE(mdiArea.activeSubWindow(), active); |
|
1087 |
QCOMPARE(mdiArea.currentSubWindow(), active); |
|
1088 |
||
1089 |
qApp->setActiveWindow(&dummyTopLevel); |
|
1090 |
QVERIFY(mdiArea.activeSubWindow()); |
|
1091 |
QCOMPARE(mdiArea.currentSubWindow(), active); |
|
1092 |
||
1093 |
qApp->setActiveWindow(&mdiArea); |
|
1094 |
active->show(); |
|
1095 |
QCOMPARE(mdiArea.activeSubWindow(), active); |
|
1096 |
||
1097 |
mdiArea.setActiveSubWindow(0); |
|
1098 |
QVERIFY(!mdiArea.activeSubWindow()); |
|
1099 |
QVERIFY(!mdiArea.currentSubWindow()); |
|
1100 |
||
1101 |
mdiArea.setActiveSubWindow(active); |
|
1102 |
QCOMPARE(mdiArea.activeSubWindow(), active); |
|
1103 |
QEvent windowDeactivate(QEvent::WindowDeactivate); |
|
1104 |
qApp->sendEvent(active, &windowDeactivate); |
|
1105 |
QVERIFY(!mdiArea.activeSubWindow()); |
|
1106 |
QVERIFY(!mdiArea.currentSubWindow()); |
|
1107 |
||
1108 |
QEvent windowActivate(QEvent::WindowActivate); |
|
1109 |
qApp->sendEvent(active, &windowActivate); |
|
1110 |
QVERIFY(mdiArea.activeSubWindow()); |
|
1111 |
QVERIFY(mdiArea.currentSubWindow()); |
|
1112 |
||
1113 |
#if !defined(Q_WS_MAC) && !defined(Q_WS_WIN) |
|
1114 |
qApp->setActiveWindow(0); |
|
1115 |
QVERIFY(!mdiArea.activeSubWindow()); |
|
1116 |
QVERIFY(mdiArea.currentSubWindow()); |
|
1117 |
#endif |
|
1118 |
} |
|
1119 |
||
1120 |
void tst_QMdiArea::addAndRemoveWindows() |
|
1121 |
{ |
|
1122 |
QMdiArea workspace; |
|
1123 |
workspace.resize(800, 600); |
|
1124 |
workspace.show(); |
|
1125 |
#ifdef Q_WS_X11 |
|
1126 |
qt_x11_wait_for_window_manager(&workspace); |
|
1127 |
#endif |
|
1128 |
||
1129 |
{ // addSubWindow with large widget |
|
1130 |
QCOMPARE(workspace.subWindowList().count(), 0); |
|
1131 |
QWidget *window = workspace.addSubWindow(new LargeWidget); |
|
1132 |
QVERIFY(window); |
|
1133 |
qApp->processEvents(); |
|
1134 |
QCOMPARE(workspace.subWindowList().count(), 1); |
|
1135 |
QVERIFY(window->windowFlags() == DefaultWindowFlags); |
|
1136 |
QCOMPARE(window->size(), workspace.viewport()->size()); |
|
1137 |
} |
|
1138 |
||
1139 |
{ // addSubWindow, minimumSize set. |
|
1140 |
QMdiSubWindow *window = new QMdiSubWindow; |
|
1141 |
window->setMinimumSize(900, 900); |
|
1142 |
workspace.addSubWindow(window); |
|
1143 |
QVERIFY(window); |
|
1144 |
qApp->processEvents(); |
|
1145 |
QCOMPARE(workspace.subWindowList().count(), 2); |
|
1146 |
QVERIFY(window->windowFlags() == DefaultWindowFlags); |
|
1147 |
QCOMPARE(window->size(), window->minimumSize()); |
|
1148 |
} |
|
1149 |
||
1150 |
{ // addSubWindow, resized |
|
1151 |
QMdiSubWindow *window = new QMdiSubWindow; |
|
1152 |
window->setWidget(new QWidget); |
|
1153 |
window->resize(1500, 1500); |
|
1154 |
workspace.addSubWindow(window); |
|
1155 |
QVERIFY(window); |
|
1156 |
qApp->processEvents(); |
|
1157 |
QCOMPARE(workspace.subWindowList().count(), 3); |
|
1158 |
QVERIFY(window->windowFlags() == DefaultWindowFlags); |
|
1159 |
QCOMPARE(window->size(), QSize(1500, 1500)); |
|
1160 |
} |
|
1161 |
||
1162 |
{ // addSubWindow with 0 pointer |
|
1163 |
QTest::ignoreMessage(QtWarningMsg, "QMdiArea::addSubWindow: null pointer to widget"); |
|
1164 |
QWidget *window = workspace.addSubWindow(0); |
|
1165 |
QVERIFY(!window); |
|
1166 |
QCOMPARE(workspace.subWindowList().count(), 3); |
|
1167 |
} |
|
1168 |
||
1169 |
{ // addChildWindow |
|
1170 |
QMdiSubWindow *window = new QMdiSubWindow; |
|
1171 |
workspace.addSubWindow(window); |
|
1172 |
qApp->processEvents(); |
|
1173 |
QVERIFY(window->windowFlags() == DefaultWindowFlags); |
|
1174 |
window->setWidget(new QWidget); |
|
1175 |
QCOMPARE(workspace.subWindowList().count(), 4); |
|
1176 |
QTest::ignoreMessage(QtWarningMsg, "QMdiArea::addSubWindow: window is already added"); |
|
1177 |
workspace.addSubWindow(window); |
|
1178 |
} |
|
1179 |
||
1180 |
{ // addChildWindow with 0 pointer |
|
1181 |
QTest::ignoreMessage(QtWarningMsg, "QMdiArea::addSubWindow: null pointer to widget"); |
|
1182 |
workspace.addSubWindow(0); |
|
1183 |
QCOMPARE(workspace.subWindowList().count(), 4); |
|
1184 |
} |
|
1185 |
||
1186 |
// removeSubWindow |
|
1187 |
foreach (QWidget *window, workspace.subWindowList()) { |
|
1188 |
workspace.removeSubWindow(window); |
|
1189 |
delete window; |
|
1190 |
} |
|
1191 |
QCOMPARE(workspace.subWindowList().count(), 0); |
|
1192 |
||
1193 |
// removeSubWindow with 0 pointer |
|
1194 |
QTest::ignoreMessage(QtWarningMsg, "QMdiArea::removeSubWindow: null pointer to widget"); |
|
1195 |
workspace.removeSubWindow(0); |
|
1196 |
||
1197 |
workspace.addSubWindow(new QPushButton(QLatin1String("Dummy to make workspace non-empty"))); |
|
1198 |
qApp->processEvents(); |
|
1199 |
QCOMPARE(workspace.subWindowList().count(), 1); |
|
1200 |
||
1201 |
// removeSubWindow with window not inside workspace |
|
1202 |
QTest::ignoreMessage(QtWarningMsg,"QMdiArea::removeSubWindow: window is not inside workspace"); |
|
1203 |
QMdiSubWindow *fakeWindow = new QMdiSubWindow; |
|
1204 |
workspace.removeSubWindow(fakeWindow); |
|
1205 |
delete fakeWindow; |
|
1206 |
||
1207 |
// Check that newly added windows don't occupy maximized windows' |
|
1208 |
// restore space. |
|
1209 |
workspace.closeAllSubWindows(); |
|
1210 |
workspace.setOption(QMdiArea::DontMaximizeSubWindowOnActivation); |
|
1211 |
workspace.show(); |
|
1212 |
QMdiSubWindow *window1 = workspace.addSubWindow(new QWidget); |
|
1213 |
window1->show(); |
|
1214 |
const QRect window1RestoreGeometry = window1->geometry(); |
|
1215 |
QCOMPARE(window1RestoreGeometry.topLeft(), QPoint(0, 0)); |
|
1216 |
||
1217 |
window1->showMinimized(); |
|
1218 |
||
1219 |
// Occupy space. |
|
1220 |
QMdiSubWindow *window2 = workspace.addSubWindow(new QWidget); |
|
1221 |
window2->show(); |
|
1222 |
const QRect window2RestoreGeometry = window2->geometry(); |
|
1223 |
QCOMPARE(window2RestoreGeometry.topLeft(), QPoint(0, 0)); |
|
1224 |
||
1225 |
window2->showMaximized(); |
|
1226 |
||
1227 |
// Don't occupy space. |
|
1228 |
QMdiSubWindow *window3 = workspace.addSubWindow(new QWidget); |
|
1229 |
window3->show(); |
|
1230 |
QCOMPARE(window3->geometry().topLeft(), QPoint(window2RestoreGeometry.right() + 1, 0)); |
|
1231 |
} |
|
1232 |
||
1233 |
void tst_QMdiArea::addAndRemoveWindowsWithReparenting() |
|
1234 |
{ |
|
1235 |
QMdiArea workspace; |
|
1236 |
QMdiSubWindow window(&workspace); |
|
1237 |
QVERIFY(window.windowFlags() == DefaultWindowFlags); |
|
1238 |
||
1239 |
// 0 because the window list contains widgets and not actual |
|
1240 |
// windows. Silly, but that's the behavior. |
|
1241 |
QCOMPARE(workspace.subWindowList().count(), 0); |
|
1242 |
window.setWidget(new QWidget); |
|
1243 |
qApp->processEvents(); |
|
1244 |
||
1245 |
QCOMPARE(workspace.subWindowList().count(), 1); |
|
1246 |
window.setParent(0); // Will also reset window flags |
|
1247 |
QCOMPARE(workspace.subWindowList().count(), 0); |
|
1248 |
window.setParent(&workspace); |
|
1249 |
QCOMPARE(workspace.subWindowList().count(), 1); |
|
1250 |
QVERIFY(window.windowFlags() == DefaultWindowFlags); |
|
1251 |
||
1252 |
QTest::ignoreMessage(QtWarningMsg, "QMdiArea::addSubWindow: window is already added"); |
|
1253 |
workspace.addSubWindow(&window); |
|
1254 |
QCOMPARE(workspace.subWindowList().count(), 1); |
|
1255 |
} |
|
1256 |
||
1257 |
class MySubWindow : public QMdiSubWindow |
|
1258 |
{ |
|
1259 |
public: |
|
1260 |
using QObject::receivers; |
|
1261 |
}; |
|
1262 |
||
1263 |
static int numberOfConnectedSignals(MySubWindow *subWindow) |
|
1264 |
{ |
|
1265 |
if (!subWindow) |
|
1266 |
return 0; |
|
1267 |
||
1268 |
int numConnectedSignals = 0; |
|
1269 |
for (int i = 0; i < subWindow->metaObject()->methodCount(); ++i) { |
|
1270 |
QMetaMethod method = subWindow->metaObject()->method(i); |
|
1271 |
if (method.methodType() == QMetaMethod::Signal) { |
|
1272 |
QString signature(QLatin1String("2")); |
|
1273 |
signature += QLatin1String(method.signature()); |
|
1274 |
numConnectedSignals += subWindow->receivers(signature.toLatin1()); |
|
1275 |
} |
|
1276 |
} |
|
1277 |
return numConnectedSignals; |
|
1278 |
} |
|
1279 |
||
1280 |
void tst_QMdiArea::removeSubWindow_2() |
|
1281 |
{ |
|
1282 |
QMdiArea mdiArea; |
|
1283 |
MySubWindow *subWindow = new MySubWindow; |
|
1284 |
QCOMPARE(numberOfConnectedSignals(subWindow), 0); |
|
1285 |
||
1286 |
// Connected to aboutToActivate() and windowStateChanged(). |
|
1287 |
mdiArea.addSubWindow(subWindow); |
|
1288 |
QVERIFY(numberOfConnectedSignals(subWindow) >= 2); |
|
1289 |
||
1290 |
// Ensure we disconnect from all signals. |
|
1291 |
mdiArea.removeSubWindow(subWindow); |
|
1292 |
QCOMPARE(numberOfConnectedSignals(subWindow), 0); |
|
1293 |
||
1294 |
mdiArea.addSubWindow(subWindow); |
|
1295 |
QVERIFY(numberOfConnectedSignals(subWindow) >= 2); |
|
1296 |
subWindow->setParent(0); |
|
1297 |
QCOMPARE(numberOfConnectedSignals(subWindow), 0); |
|
1298 |
} |
|
1299 |
||
1300 |
void tst_QMdiArea::closeWindows() |
|
1301 |
{ |
|
1302 |
QMdiArea workspace; |
|
1303 |
workspace.show(); |
|
1304 |
qApp->setActiveWindow(&workspace); |
|
1305 |
||
1306 |
// Close widget |
|
1307 |
QWidget *widget = new QWidget; |
|
1308 |
QMdiSubWindow *subWindow = workspace.addSubWindow(widget); |
|
1309 |
qApp->processEvents(); |
|
1310 |
QCOMPARE(workspace.subWindowList().count(), 1); |
|
1311 |
subWindow->close(); |
|
1312 |
QCOMPARE(workspace.subWindowList().count(), 0); |
|
1313 |
||
1314 |
// Close window |
|
1315 |
QWidget *window = workspace.addSubWindow(new QWidget); |
|
1316 |
qApp->processEvents(); |
|
1317 |
QCOMPARE(workspace.subWindowList().count(), 1); |
|
1318 |
window->close(); |
|
1319 |
qApp->processEvents(); |
|
1320 |
QCOMPARE(workspace.subWindowList().count(), 0); |
|
1321 |
||
1322 |
const int windowCount = 10; |
|
1323 |
||
1324 |
// Close active window |
|
1325 |
for (int i = 0; i < windowCount; ++i) |
|
1326 |
workspace.addSubWindow(new QWidget)->show(); |
|
1327 |
qApp->processEvents(); |
|
1328 |
QCOMPARE(workspace.subWindowList().count(), windowCount); |
|
1329 |
int activeSubWindowCount = 0; |
|
1330 |
while (workspace.activeSubWindow()) { |
|
1331 |
workspace.activeSubWindow()->close(); |
|
1332 |
qApp->processEvents(); |
|
1333 |
++activeSubWindowCount; |
|
1334 |
} |
|
1335 |
QCOMPARE(activeSubWindowCount, windowCount); |
|
1336 |
QCOMPARE(workspace.subWindowList().count(), 0); |
|
1337 |
||
1338 |
// Close all windows |
|
1339 |
for (int i = 0; i < windowCount; ++i) |
|
1340 |
workspace.addSubWindow(new QWidget)->show(); |
|
1341 |
qApp->processEvents(); |
|
1342 |
QCOMPARE(workspace.subWindowList().count(), windowCount); |
|
1343 |
QSignalSpy spy(&workspace, SIGNAL(subWindowActivated(QMdiSubWindow *))); |
|
1344 |
connect(&workspace, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(activeChanged(QMdiSubWindow *))); |
|
1345 |
workspace.closeAllSubWindows(); |
|
1346 |
qApp->processEvents(); |
|
1347 |
QCOMPARE(workspace.subWindowList().count(), 0); |
|
1348 |
QCOMPARE(spy.count(), 1); |
|
1349 |
QVERIFY(!activeWindow); |
|
1350 |
} |
|
1351 |
||
1352 |
void tst_QMdiArea::activateNextAndPreviousWindow() |
|
1353 |
{ |
|
1354 |
QMdiArea workspace; |
|
1355 |
workspace.show(); |
|
1356 |
qApp->setActiveWindow(&workspace); |
|
1357 |
||
1358 |
const int windowCount = 10; |
|
1359 |
QMdiSubWindow *windows[windowCount]; |
|
1360 |
for (int i = 0; i < windowCount; ++i) { |
|
1361 |
windows[i] = qobject_cast<QMdiSubWindow *>(workspace.addSubWindow(new QWidget)); |
|
1362 |
windows[i]->show(); |
|
1363 |
qApp->processEvents(); |
|
1364 |
} |
|
1365 |
||
1366 |
QSignalSpy spy(&workspace, SIGNAL(subWindowActivated(QMdiSubWindow *))); |
|
1367 |
connect(&workspace, SIGNAL(subWindowActivated(QMdiSubWindow *)), this, SLOT(activeChanged(QMdiSubWindow *))); |
|
1368 |
||
1369 |
// activateNextSubWindow |
|
1370 |
for (int i = 0; i < windowCount; ++i) { |
|
1371 |
workspace.activateNextSubWindow(); |
|
1372 |
qApp->processEvents(); |
|
1373 |
QCOMPARE(workspace.activeSubWindow(), windows[i]); |
|
1374 |
QCOMPARE(spy.count(), 1); |
|
1375 |
spy.clear(); |
|
1376 |
} |
|
1377 |
QVERIFY(activeWindow); |
|
1378 |
QCOMPARE(workspace.activeSubWindow(), windows[windowCount - 1]); |
|
1379 |
QCOMPARE(workspace.activeSubWindow(), activeWindow); |
|
1380 |
||
1381 |
// activatePreviousSubWindow |
|
1382 |
for (int i = windowCount - 2; i >= 0; --i) { |
|
1383 |
workspace.activatePreviousSubWindow(); |
|
1384 |
qApp->processEvents(); |
|
1385 |
QCOMPARE(workspace.activeSubWindow(), windows[i]); |
|
1386 |
QCOMPARE(spy.count(), 1); |
|
1387 |
spy.clear(); |
|
1388 |
if (i % 2 == 0) |
|
1389 |
windows[i]->hide(); // 10, 8, 6, 4, 2, 0 |
|
1390 |
} |
|
1391 |
QVERIFY(activeWindow); |
|
1392 |
QCOMPARE(workspace.activeSubWindow(), windows[0]); |
|
1393 |
QCOMPARE(workspace.activeSubWindow(), activeWindow); |
|
1394 |
||
1395 |
// activateNextSubWindow with every 2nd window hidden |
|
1396 |
for (int i = 0; i < windowCount / 2; ++i) { |
|
1397 |
workspace.activateNextSubWindow(); // 1, 3, 5, 7, 9 |
|
1398 |
QCOMPARE(spy.count(), 1); |
|
1399 |
spy.clear(); |
|
1400 |
} |
|
1401 |
QCOMPARE(workspace.activeSubWindow(), windows[windowCount - 1]); |
|
1402 |
||
1403 |
// activatePreviousSubWindow with every 2nd window hidden |
|
1404 |
for (int i = 0; i < windowCount / 2; ++i) { |
|
1405 |
workspace.activatePreviousSubWindow(); // 7, 5, 3, 1, 9 |
|
1406 |
QCOMPARE(spy.count(), 1); |
|
1407 |
spy.clear(); |
|
1408 |
} |
|
1409 |
QCOMPARE(workspace.activeSubWindow(), windows[windowCount - 1]); |
|
1410 |
||
1411 |
workspace.setActiveSubWindow(0); |
|
1412 |
QVERIFY(!activeWindow); |
|
1413 |
} |
|
1414 |
||
1415 |
void tst_QMdiArea::subWindowList_data() |
|
1416 |
{ |
|
1417 |
QTest::addColumn<QMdiArea::WindowOrder>("windowOrder"); |
|
1418 |
QTest::addColumn<int>("windowCount"); |
|
1419 |
QTest::addColumn<int>("activeSubWindow"); |
|
1420 |
QTest::addColumn<int>("staysOnTop1"); |
|
1421 |
QTest::addColumn<int>("staysOnTop2"); |
|
1422 |
||
1423 |
QTest::newRow("CreationOrder") << QMdiArea::CreationOrder << 10 << 4 << 8 << 5; |
|
1424 |
QTest::newRow("StackingOrder") << QMdiArea::StackingOrder << 10 << 6 << 3 << 9; |
|
1425 |
QTest::newRow("ActivationHistoryOrder") << QMdiArea::ActivationHistoryOrder << 10 << 7 << 2 << 1; |
|
1426 |
} |
|
1427 |
void tst_QMdiArea::subWindowList() |
|
1428 |
{ |
|
1429 |
QFETCH(QMdiArea::WindowOrder, windowOrder); |
|
1430 |
QFETCH(int, windowCount); |
|
1431 |
QFETCH(int, activeSubWindow); |
|
1432 |
QFETCH(int, staysOnTop1); |
|
1433 |
QFETCH(int, staysOnTop2); |
|
1434 |
||
1435 |
QMdiArea workspace; |
|
1436 |
workspace.show(); |
|
1437 |
qApp->setActiveWindow(&workspace); |
|
1438 |
||
1439 |
QList<QMdiSubWindow *> activationOrder; |
|
1440 |
QVector<QMdiSubWindow *> windows; |
|
1441 |
for (int i = 0; i < windowCount; ++i) { |
|
1442 |
windows.append(qobject_cast<QMdiSubWindow *>(workspace.addSubWindow(new QWidget))); |
|
1443 |
windows[i]->show(); |
|
1444 |
activationOrder.append(windows[i]); |
|
1445 |
} |
|
1446 |
||
1447 |
{ |
|
1448 |
QList<QMdiSubWindow *> widgets = workspace.subWindowList(windowOrder); |
|
1449 |
QCOMPARE(widgets.count(), windowCount); |
|
1450 |
for (int i = 0; i < widgets.count(); ++i) |
|
1451 |
QCOMPARE(widgets.at(i), windows[i]); |
|
1452 |
} |
|
1453 |
||
1454 |
windows[staysOnTop1]->setWindowFlags(windows[staysOnTop1]->windowFlags() | Qt::WindowStaysOnTopHint); |
|
1455 |
workspace.setActiveSubWindow(windows[activeSubWindow]); |
|
1456 |
qApp->processEvents(); |
|
1457 |
QCOMPARE(workspace.activeSubWindow(), windows[activeSubWindow]); |
|
1458 |
activationOrder.move(activationOrder.indexOf(windows[activeSubWindow]), windowCount - 1); |
|
1459 |
||
1460 |
QList<QMdiSubWindow *> subWindows = workspace.subWindowList(windowOrder); |
|
1461 |
if (windowOrder == QMdiArea::CreationOrder) { |
|
1462 |
QCOMPARE(subWindows.at(activeSubWindow), windows[activeSubWindow]); |
|
1463 |
QCOMPARE(subWindows.at(staysOnTop1), windows[staysOnTop1]); |
|
1464 |
for (int i = 0; i < windowCount; ++i) |
|
1465 |
QCOMPARE(subWindows.at(i), windows[i]); |
|
1466 |
return; |
|
1467 |
} |
|
1468 |
||
1469 |
if (windowOrder == QMdiArea::StackingOrder) { |
|
1470 |
QCOMPARE(subWindows.at(subWindows.count() - 1), windows[staysOnTop1]); |
|
1471 |
QCOMPARE(subWindows.at(subWindows.count() - 2), windows[activeSubWindow]); |
|
1472 |
QCOMPARE(subWindows.count(), windowCount); |
|
1473 |
} else { // ActivationHistoryOrder |
|
1474 |
QCOMPARE(subWindows, activationOrder); |
|
1475 |
} |
|
1476 |
||
1477 |
windows[staysOnTop2]->setWindowFlags(windows[staysOnTop2]->windowFlags() | Qt::WindowStaysOnTopHint); |
|
1478 |
workspace.setActiveSubWindow(windows[staysOnTop2]); |
|
1479 |
qApp->processEvents(); |
|
1480 |
QCOMPARE(workspace.activeSubWindow(), windows[staysOnTop2]); |
|
1481 |
activationOrder.move(activationOrder.indexOf(windows[staysOnTop2]), windowCount - 1); |
|
1482 |
||
1483 |
workspace.setActiveSubWindow(windows[activeSubWindow]); |
|
1484 |
qApp->processEvents(); |
|
1485 |
QCOMPARE(workspace.activeSubWindow(), windows[activeSubWindow]); |
|
1486 |
activationOrder.move(activationOrder.indexOf(windows[activeSubWindow]), windowCount - 1); |
|
1487 |
||
1488 |
QList<QMdiSubWindow *> widgets = workspace.subWindowList(windowOrder); |
|
1489 |
QCOMPARE(widgets.count(), windowCount); |
|
1490 |
if (windowOrder == QMdiArea::StackingOrder) { |
|
1491 |
QCOMPARE(widgets.at(widgets.count() - 1), windows[staysOnTop2]); |
|
1492 |
QCOMPARE(widgets.at(widgets.count() - 2), windows[staysOnTop1]); |
|
1493 |
QCOMPARE(widgets.at(widgets.count() - 3), windows[activeSubWindow]); |
|
1494 |
} else { // ActivationHistory |
|
1495 |
QCOMPARE(widgets, activationOrder); |
|
1496 |
} |
|
1497 |
||
1498 |
windows[activeSubWindow]->raise(); |
|
1499 |
windows[staysOnTop2]->lower(); |
|
1500 |
||
1501 |
widgets = workspace.subWindowList(windowOrder); |
|
1502 |
if (windowOrder == QMdiArea::StackingOrder) { |
|
1503 |
QCOMPARE(widgets.at(widgets.count() - 1), windows[activeSubWindow]); |
|
1504 |
QCOMPARE(widgets.at(widgets.count() - 2), windows[staysOnTop1]); |
|
1505 |
QCOMPARE(widgets.at(0), windows[staysOnTop2]); |
|
1506 |
} else { // ActivationHistoryOrder |
|
1507 |
QCOMPARE(widgets, activationOrder); |
|
1508 |
} |
|
1509 |
||
1510 |
windows[activeSubWindow]->stackUnder(windows[staysOnTop1]); |
|
1511 |
windows[staysOnTop2]->raise(); |
|
1512 |
||
1513 |
widgets = workspace.subWindowList(windowOrder); |
|
1514 |
if (windowOrder == QMdiArea::StackingOrder) { |
|
1515 |
QCOMPARE(widgets.at(widgets.count() - 1), windows[staysOnTop2]); |
|
1516 |
QCOMPARE(widgets.at(widgets.count() - 2), windows[staysOnTop1]); |
|
1517 |
QCOMPARE(widgets.at(widgets.count() - 3), windows[activeSubWindow]); |
|
1518 |
} else { // ActivationHistoryOrder |
|
1519 |
QCOMPARE(widgets, activationOrder); |
|
1520 |
} |
|
1521 |
||
1522 |
workspace.setActiveSubWindow(windows[staysOnTop1]); |
|
1523 |
activationOrder.move(activationOrder.indexOf(windows[staysOnTop1]), windowCount - 1); |
|
1524 |
||
1525 |
widgets = workspace.subWindowList(windowOrder); |
|
1526 |
if (windowOrder == QMdiArea::StackingOrder) { |
|
1527 |
QCOMPARE(widgets.at(widgets.count() - 1), windows[staysOnTop1]); |
|
1528 |
QCOMPARE(widgets.at(widgets.count() - 2), windows[staysOnTop2]); |
|
1529 |
QCOMPARE(widgets.at(widgets.count() - 3), windows[activeSubWindow]); |
|
1530 |
} else { // ActivationHistoryOrder |
|
1531 |
QCOMPARE(widgets, activationOrder); |
|
1532 |
} |
|
1533 |
} |
|
1534 |
||
1535 |
void tst_QMdiArea::setBackground() |
|
1536 |
{ |
|
1537 |
QMdiArea workspace; |
|
1538 |
QCOMPARE(workspace.background(), workspace.palette().brush(QPalette::Dark)); |
|
1539 |
workspace.setBackground(QBrush(Qt::green)); |
|
1540 |
QCOMPARE(workspace.background(), QBrush(Qt::green)); |
|
1541 |
} |
|
1542 |
||
1543 |
void tst_QMdiArea::setViewport() |
|
1544 |
{ |
|
1545 |
QMdiArea workspace; |
|
1546 |
workspace.show(); |
|
1547 |
||
1548 |
QWidget *firstViewport = workspace.viewport(); |
|
1549 |
QVERIFY(firstViewport); |
|
1550 |
||
1551 |
const int windowCount = 10; |
|
1552 |
for (int i = 0; i < windowCount; ++i) { |
|
1553 |
QMdiSubWindow *window = workspace.addSubWindow(new QWidget); |
|
1554 |
window->show(); |
|
1555 |
if (i % 2 == 0) { |
|
1556 |
window->showMinimized(); |
|
1557 |
QVERIFY(window->isMinimized()); |
|
1558 |
} else { |
|
1559 |
window->showMaximized(); |
|
1560 |
QVERIFY(window->isMaximized()); |
|
1561 |
} |
|
1562 |
} |
|
1563 |
||
1564 |
qApp->processEvents(); |
|
1565 |
QList<QMdiSubWindow *> windowsBeforeViewportChange = workspace.subWindowList(); |
|
1566 |
QCOMPARE(windowsBeforeViewportChange.count(), windowCount); |
|
1567 |
||
1568 |
workspace.setViewport(new QWidget); |
|
1569 |
qApp->processEvents(); |
|
1570 |
QVERIFY(workspace.viewport() != firstViewport); |
|
1571 |
||
1572 |
QList<QMdiSubWindow *> windowsAfterViewportChange = workspace.subWindowList(); |
|
1573 |
QCOMPARE(windowsAfterViewportChange.count(), windowCount); |
|
1574 |
QCOMPARE(windowsAfterViewportChange, windowsBeforeViewportChange); |
|
1575 |
||
1576 |
// for (int i = 0; i < windowCount; ++i) { |
|
1577 |
// QMdiSubWindow *window = windowsAfterViewportChange.at(i); |
|
1578 |
// if (i % 2 == 0) |
|
1579 |
// QVERIFY(!window->isMinimized()); |
|
1580 |
//else |
|
1581 |
// QVERIFY(!window->isMaximized()); |
|
1582 |
// } |
|
1583 |
||
1584 |
QTest::ignoreMessage(QtWarningMsg, "QMdiArea: Deleting the view port is undefined, " |
|
1585 |
"use setViewport instead."); |
|
1586 |
delete workspace.viewport(); |
|
1587 |
qApp->processEvents(); |
|
1588 |
||
1589 |
QCOMPARE(workspace.subWindowList().count(), 0); |
|
1590 |
QVERIFY(!workspace.activeSubWindow()); |
|
1591 |
} |
|
1592 |
||
1593 |
void tst_QMdiArea::tileSubWindows() |
|
1594 |
{ |
|
1595 |
QMdiArea workspace; |
|
1596 |
workspace.resize(600,480); |
|
1597 |
workspace.show(); |
|
1598 |
#ifdef Q_WS_X11 |
|
1599 |
qt_x11_wait_for_window_manager(&workspace); |
|
1600 |
#endif |
|
1601 |
||
1602 |
const int windowCount = 10; |
|
1603 |
for (int i = 0; i < windowCount; ++i) { |
|
1604 |
QMdiSubWindow *subWindow = workspace.addSubWindow(new QWidget); |
|
1605 |
subWindow->setMinimumSize(50, 30); |
|
1606 |
subWindow->show(); |
|
1607 |
} |
|
1608 |
workspace.tileSubWindows(); |
|
1609 |
workspace.setActiveSubWindow(0); |
|
1610 |
QCOMPARE(workspace.viewport()->childrenRect(), workspace.viewport()->rect()); |
|
1611 |
||
1612 |
QList<QMdiSubWindow *> windows = workspace.subWindowList(); |
|
1613 |
for (int i = 0; i < windowCount; ++i) { |
|
1614 |
QMdiSubWindow *window = windows.at(i); |
|
1615 |
for (int j = 0; j < windowCount; ++j) { |
|
1616 |
if (i == j) |
|
1617 |
continue; |
|
1618 |
QVERIFY(!window->geometry().intersects(windows.at(j)->geometry())); |
|
1619 |
} |
|
1620 |
} |
|
1621 |
||
1622 |
// Keep the views tiled through any subsequent resize events. |
|
1623 |
for (int i = 0; i < 5; ++i) { |
|
1624 |
workspace.resize(workspace.size() - QSize(10, 10)); |
|
1625 |
qApp->processEvents(); |
|
1626 |
} |
|
1627 |
workspace.setActiveSubWindow(0); |
|
1628 |
#ifndef Q_OS_WINCE //See Task 197453 ToDo |
|
1629 |
QCOMPARE(workspace.viewport()->childrenRect(), workspace.viewport()->rect()); |
|
1630 |
#endif |
|
1631 |
||
1632 |
QMdiSubWindow *window = windows.at(0); |
|
1633 |
||
1634 |
// Change the geometry of one of the children and verify |
|
1635 |
// that the views are not tiled anymore. |
|
1636 |
window->move(window->x() + 1, window->y()); |
|
1637 |
workspace.resize(workspace.size() - QSize(10, 10)); |
|
1638 |
workspace.setActiveSubWindow(0); |
|
1639 |
QVERIFY(workspace.viewport()->childrenRect() != workspace.viewport()->rect()); |
|
1640 |
qApp->processEvents(); |
|
1641 |
||
1642 |
// Re-tile. |
|
1643 |
workspace.tileSubWindows(); |
|
1644 |
workspace.setActiveSubWindow(0); |
|
1645 |
QCOMPARE(workspace.viewport()->childrenRect(), workspace.viewport()->rect()); |
|
1646 |
||
1647 |
// Close one of the children and verify that the views |
|
1648 |
// are not tiled anymore. |
|
1649 |
window->close(); |
|
1650 |
workspace.resize(workspace.size() - QSize(10, 10)); |
|
1651 |
workspace.setActiveSubWindow(0); |
|
1652 |
QVERIFY(workspace.viewport()->childrenRect() != workspace.viewport()->rect()); |
|
1653 |
qApp->processEvents(); |
|
1654 |
||
1655 |
// Re-tile. |
|
1656 |
workspace.tileSubWindows(); |
|
1657 |
workspace.setActiveSubWindow(0); |
|
1658 |
QCOMPARE(workspace.viewport()->childrenRect(), workspace.viewport()->rect()); |
|
1659 |
||
1660 |
window = windows.at(1); |
|
1661 |
||
1662 |
// Maximize one of the children and verify that the views |
|
1663 |
// are not tiled anymore. |
|
1664 |
workspace.tileSubWindows(); |
|
1665 |
window->showMaximized(); |
|
1666 |
workspace.resize(workspace.size() - QSize(10, 10)); |
|
1667 |
workspace.setActiveSubWindow(0); |
|
1668 |
QVERIFY(workspace.viewport()->childrenRect() != workspace.viewport()->rect()); |
|
1669 |
qApp->processEvents(); |
|
1670 |
||
1671 |
// Re-tile. |
|
1672 |
workspace.tileSubWindows(); |
|
1673 |
workspace.setActiveSubWindow(0); |
|
1674 |
QCOMPARE(workspace.viewport()->childrenRect(), workspace.viewport()->rect()); |
|
1675 |
||
1676 |
// Minimize one of the children and verify that the views |
|
1677 |
// are not tiled anymore. |
|
1678 |
workspace.tileSubWindows(); |
|
1679 |
window->showMinimized(); |
|
1680 |
workspace.resize(workspace.size() - QSize(10, 10)); |
|
1681 |
workspace.setActiveSubWindow(0); |
|
1682 |
QVERIFY(workspace.viewport()->childrenRect() != workspace.viewport()->rect()); |
|
1683 |
qApp->processEvents(); |
|
1684 |
||
1685 |
// Re-tile. |
|
1686 |
workspace.tileSubWindows(); |
|
1687 |
workspace.setActiveSubWindow(0); |
|
1688 |
QCOMPARE(workspace.viewport()->childrenRect(), workspace.viewport()->rect()); |
|
1689 |
||
1690 |
// Active/deactivate windows and verify that the views are tiled. |
|
1691 |
workspace.setActiveSubWindow(windows.at(5)); |
|
1692 |
workspace.resize(workspace.size() - QSize(10, 10)); |
|
1693 |
workspace.setActiveSubWindow(0); |
|
1694 |
QTest::qWait(250); // delayed re-arrange of minimized windows |
|
1695 |
QTRY_COMPARE(workspace.viewport()->childrenRect(), workspace.viewport()->rect()); |
|
1696 |
||
1697 |
// Add another window and verify that the views are not tiled anymore. |
|
1698 |
workspace.addSubWindow(new QPushButton(QLatin1String("I'd like to mess up tiled views")))->show(); |
|
1699 |
workspace.resize(workspace.size() - QSize(10, 10)); |
|
1700 |
workspace.setActiveSubWindow(0); |
|
1701 |
QVERIFY(workspace.viewport()->childrenRect() != workspace.viewport()->rect()); |
|
1702 |
||
1703 |
// Re-tile. |
|
1704 |
workspace.tileSubWindows(); |
|
1705 |
workspace.setActiveSubWindow(0); |
|
1706 |
QCOMPARE(workspace.viewport()->childrenRect(), workspace.viewport()->rect()); |
|
1707 |
||
1708 |
// Cascade and verify that the views are not tiled anymore. |
|
1709 |
workspace.cascadeSubWindows(); |
|
1710 |
workspace.resize(workspace.size() - QSize(10, 10)); |
|
1711 |
workspace.setActiveSubWindow(0); |
|
1712 |
QVERIFY(workspace.viewport()->childrenRect() != workspace.viewport()->rect()); |
|
1713 |
||
1714 |
// Make sure the active window is placed in top left corner regardless |
|
1715 |
// of whether we have any windows with staysOnTopHint or not. |
|
1716 |
windows.at(3)->setWindowFlags(windows.at(3)->windowFlags() | Qt::WindowStaysOnTopHint); |
|
1717 |
QMdiSubWindow *activeSubWindow = windows.at(6); |
|
1718 |
workspace.setActiveSubWindow(activeSubWindow); |
|
1719 |
QCOMPARE(workspace.activeSubWindow(), activeSubWindow); |
|
1720 |
workspace.tileSubWindows(); |
|
1721 |
QCOMPARE(activeSubWindow->geometry().topLeft(), QPoint(0, 0)); |
|
1722 |
||
1723 |
// Verify that we try to resize the area such that all sub-windows are visible. |
|
1724 |
// It's important that tiled windows are NOT overlapping. |
|
1725 |
workspace.resize(350, 150); |
|
1726 |
qApp->processEvents(); |
|
1727 |
QTRY_COMPARE(workspace.size(), QSize(350, 150)); |
|
1728 |
||
1729 |
const QSize minSize(300, 100); |
|
1730 |
foreach (QMdiSubWindow *subWindow, workspace.subWindowList()) |
|
1731 |
subWindow->setMinimumSize(minSize); |
|
1732 |
||
1733 |
QCOMPARE(workspace.size(), QSize(350, 150)); |
|
1734 |
workspace.tileSubWindows(); |
|
1735 |
// The sub-windows are now tiled like this: |
|
1736 |
// | win 1 || win 2 || win 3 | |
|
1737 |
// +-------++-------++-------+ |
|
1738 |
// +-------++-------++-------+ |
|
1739 |
// | win 4 || win 5 || win 6 | |
|
1740 |
// +-------++-------++-------+ |
|
1741 |
// +-------++-------++-------+ |
|
1742 |
// | win 7 || win 8 || win 9 | |
|
1743 |
workspace.setActiveSubWindow(0); |
|
1744 |
int frameWidth = 0; |
|
1745 |
if (workspace.style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, 0, &workspace)) |
|
1746 |
frameWidth = workspace.style()->pixelMetric(QStyle::PM_DefaultFrameWidth); |
|
1747 |
const int spacing = 2 * frameWidth + 2; |
|
1748 |
const QSize expectedViewportSize(3 * minSize.width() + spacing, 3 * minSize.height() + spacing); |
|
1749 |
#ifdef Q_OS_WINCE |
|
1750 |
QSKIP("Not fixed yet! See task 197453", SkipAll); |
|
1751 |
#endif |
|
1752 |
QTRY_COMPARE(workspace.viewport()->rect().size(), expectedViewportSize); |
|
1753 |
||
1754 |
// Not enough space for all sub-windows to be visible -> provide scroll bars. |
|
1755 |
workspace.resize(150, 150); |
|
1756 |
qApp->processEvents(); |
|
1757 |
QTRY_COMPARE(workspace.size(), QSize(150, 150)); |
|
1758 |
||
1759 |
// Horizontal scroll bar. |
|
1760 |
QScrollBar *hBar = workspace.horizontalScrollBar(); |
|
1761 |
QCOMPARE(workspace.horizontalScrollBarPolicy(), Qt::ScrollBarAsNeeded); |
|
1762 |
QTRY_VERIFY(hBar->isVisible()); |
|
1763 |
QCOMPARE(hBar->value(), 0); |
|
1764 |
QCOMPARE(hBar->minimum(), 0); |
|
1765 |
||
1766 |
// Vertical scroll bar. |
|
1767 |
QScrollBar *vBar = workspace.verticalScrollBar(); |
|
1768 |
QCOMPARE(workspace.verticalScrollBarPolicy(), Qt::ScrollBarAsNeeded); |
|
1769 |
QVERIFY(vBar->isVisible()); |
|
1770 |
QCOMPARE(vBar->value(), 0); |
|
1771 |
QCOMPARE(vBar->minimum(), 0); |
|
1772 |
||
1773 |
workspace.tileSubWindows(); |
|
1774 |
#ifdef Q_WS_X11 |
|
1775 |
qt_x11_wait_for_window_manager(&workspace); |
|
1776 |
#endif |
|
1777 |
qApp->processEvents(); |
|
1778 |
||
1779 |
QTRY_VERIFY(workspace.size() != QSize(150, 150)); |
|
1780 |
QTRY_VERIFY(!vBar->isVisible()); |
|
1781 |
QTRY_VERIFY(!hBar->isVisible()); |
|
1782 |
} |
|
1783 |
||
1784 |
void tst_QMdiArea::cascadeAndTileSubWindows() |
|
1785 |
{ |
|
1786 |
QMdiArea workspace; |
|
1787 |
workspace.resize(400, 400); |
|
1788 |
workspace.show(); |
|
1789 |
#ifdef Q_WS_X11 |
|
1790 |
qt_x11_wait_for_window_manager(&workspace); |
|
1791 |
#endif |
|
1792 |
||
1793 |
const int windowCount = 10; |
|
1794 |
QList<QMdiSubWindow *> windows; |
|
1795 |
for (int i = 0; i < windowCount; ++i) { |
|
1796 |
QMdiSubWindow *window = workspace.addSubWindow(new MyChild); |
|
1797 |
if (i % 3 == 0) { |
|
1798 |
window->showMinimized(); |
|
1799 |
QVERIFY(window->isMinimized()); |
|
1800 |
} else { |
|
1801 |
window->showMaximized(); |
|
1802 |
QVERIFY(window->isMaximized()); |
|
1803 |
} |
|
1804 |
windows.append(window); |
|
1805 |
} |
|
1806 |
||
1807 |
// cascadeSubWindows |
|
1808 |
qApp->processEvents(); |
|
1809 |
workspace.cascadeSubWindows(); |
|
1810 |
qApp->processEvents(); |
|
1811 |
||
1812 |
// Check dy between two cascaded windows |
|
1813 |
QStyleOptionTitleBar options; |
|
1814 |
options.initFrom(windows.at(1)); |
|
1815 |
int titleBarHeight = windows.at(1)->style()->pixelMetric(QStyle::PM_TitleBarHeight, &options); |
|
1816 |
// ### Remove this after the mac style has been fixed |
|
1817 |
if (windows.at(1)->style()->inherits("QMacStyle")) |
|
1818 |
titleBarHeight -= 4; |
|
1819 |
const QFontMetrics fontMetrics = QFontMetrics(QApplication::font("QWorkspaceTitleBar")); |
|
1820 |
const int dy = qMax(titleBarHeight - (titleBarHeight - fontMetrics.height()) / 2, 1); |
|
1821 |
QCOMPARE(windows.at(2)->geometry().top() - windows.at(1)->geometry().top(), dy); |
|
1822 |
||
1823 |
for (int i = 0; i < windows.count(); ++i) { |
|
1824 |
QMdiSubWindow *window = windows.at(i); |
|
1825 |
if (i % 3 == 0) { |
|
1826 |
QVERIFY(window->isMinimized()); |
|
1827 |
} else { |
|
1828 |
QVERIFY(!window->isMaximized()); |
|
1829 |
QCOMPARE(window->size(), window->sizeHint()); |
|
1830 |
window->showMaximized(); |
|
1831 |
QVERIFY(window->isMaximized()); |
|
1832 |
} |
|
1833 |
} |
|
1834 |
} |
|
1835 |
||
1836 |
void tst_QMdiArea::resizeMaximizedChildWindows_data() |
|
1837 |
{ |
|
1838 |
QTest::addColumn<int>("startSize"); |
|
1839 |
QTest::addColumn<int>("increment"); |
|
1840 |
QTest::addColumn<int>("windowCount"); |
|
1841 |
||
1842 |
QTest::newRow("multiple children") << 400 << 20 << 10; |
|
1843 |
} |
|
1844 |
||
1845 |
void tst_QMdiArea::resizeMaximizedChildWindows() |
|
1846 |
{ |
|
1847 |
QFETCH(int, startSize); |
|
1848 |
QFETCH(int, increment); |
|
1849 |
QFETCH(int, windowCount); |
|
1850 |
||
1851 |
QMdiArea workspace; |
|
1852 |
workspace.show(); |
|
1853 |
#if defined(Q_WS_X11) |
|
1854 |
qt_x11_wait_for_window_manager(&workspace); |
|
1855 |
#endif |
|
1856 |
QTest::qWait(100); |
|
1857 |
workspace.resize(startSize, startSize); |
|
1858 |
workspace.setOption(QMdiArea::DontMaximizeSubWindowOnActivation); |
|
1859 |
QSize workspaceSize = workspace.size(); |
|
1860 |
QVERIFY(workspaceSize.isValid()); |
|
1861 |
QCOMPARE(workspaceSize, QSize(startSize, startSize)); |
|
1862 |
||
1863 |
QList<QMdiSubWindow *> windows; |
|
1864 |
for (int i = 0; i < windowCount; ++i) { |
|
1865 |
QMdiSubWindow *window = workspace.addSubWindow(new QWidget); |
|
1866 |
windows.append(window); |
|
1867 |
qApp->processEvents(); |
|
1868 |
window->showMaximized(); |
|
1869 |
QTest::qWait(100); |
|
1870 |
QVERIFY(window->isMaximized()); |
|
1871 |
QSize windowSize = window->size(); |
|
1872 |
QVERIFY(windowSize.isValid()); |
|
1873 |
QCOMPARE(window->rect(), workspace.contentsRect()); |
|
1874 |
||
1875 |
workspace.resize(workspaceSize + QSize(increment, increment)); |
|
1876 |
QTest::qWait(100); |
|
1877 |
qApp->processEvents(); |
|
1878 |
QTRY_COMPARE(workspace.size(), workspaceSize + QSize(increment, increment)); |
|
1879 |
QTRY_COMPARE(window->size(), windowSize + QSize(increment, increment)); |
|
1880 |
workspaceSize = workspace.size(); |
|
1881 |
} |
|
1882 |
||
1883 |
int newSize = startSize + increment * windowCount; |
|
1884 |
QCOMPARE(workspaceSize, QSize(newSize, newSize)); |
|
1885 |
foreach (QWidget *window, windows) |
|
1886 |
QCOMPARE(window->rect(), workspace.contentsRect()); |
|
1887 |
} |
|
1888 |
||
1889 |
// QWidget::setParent clears focusWidget so make sure |
|
1890 |
// we restore it after QMdiArea::addSubWindow. |
|
1891 |
void tst_QMdiArea::focusWidgetAfterAddSubWindow() |
|
1892 |
{ |
|
1893 |
QWidget *view = new QWidget; |
|
1894 |
view->setLayout(new QVBoxLayout); |
|
1895 |
||
1896 |
QLineEdit *lineEdit1 = new QLineEdit; |
|
1897 |
QLineEdit *lineEdit2 = new QLineEdit; |
|
1898 |
view->layout()->addWidget(lineEdit1); |
|
1899 |
view->layout()->addWidget(lineEdit2); |
|
1900 |
||
1901 |
lineEdit2->setFocus(); |
|
1902 |
QCOMPARE(view->focusWidget(), static_cast<QWidget *>(lineEdit2)); |
|
1903 |
||
1904 |
QMdiArea mdiArea; |
|
1905 |
mdiArea.addSubWindow(view); |
|
1906 |
QCOMPARE(view->focusWidget(), static_cast<QWidget *>(lineEdit2)); |
|
1907 |
||
1908 |
mdiArea.show(); |
|
1909 |
view->show(); |
|
1910 |
qApp->setActiveWindow(&mdiArea); |
|
1911 |
QCOMPARE(qApp->focusWidget(), static_cast<QWidget *>(lineEdit2)); |
|
1912 |
} |
|
1913 |
||
1914 |
void tst_QMdiArea::dontMaximizeSubWindowOnActivation() |
|
1915 |
{ |
|
1916 |
QMdiArea mdiArea; |
|
1917 |
mdiArea.show(); |
|
1918 |
#ifdef Q_WS_X11 |
|
1919 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
1920 |
#endif |
|
1921 |
qApp->setActiveWindow(&mdiArea); |
|
1922 |
||
1923 |
// Add one maximized window. |
|
1924 |
mdiArea.addSubWindow(new QWidget)->showMaximized(); |
|
1925 |
QVERIFY(mdiArea.activeSubWindow()); |
|
1926 |
QVERIFY(mdiArea.activeSubWindow()->isMaximized()); |
|
1927 |
||
1928 |
// Add few more windows and verify that they are maximized. |
|
1929 |
for (int i = 0; i < 5; ++i) { |
|
1930 |
QMdiSubWindow *window = mdiArea.addSubWindow(new QWidget); |
|
1931 |
window->show(); |
|
1932 |
QVERIFY(window->isMaximized()); |
|
1933 |
qApp->processEvents(); |
|
1934 |
} |
|
1935 |
||
1936 |
// Verify that activated windows still are maximized on activation. |
|
1937 |
QList<QMdiSubWindow *> subWindows = mdiArea.subWindowList(); |
|
1938 |
for (int i = 0; i < subWindows.count(); ++i) { |
|
1939 |
mdiArea.activateNextSubWindow(); |
|
1940 |
QMdiSubWindow *window = subWindows.at(i); |
|
1941 |
QCOMPARE(mdiArea.activeSubWindow(), window); |
|
1942 |
QVERIFY(window->isMaximized()); |
|
1943 |
qApp->processEvents(); |
|
1944 |
} |
|
1945 |
||
1946 |
// Restore active window and verify that other windows aren't |
|
1947 |
// maximized on activation. |
|
1948 |
mdiArea.activeSubWindow()->showNormal(); |
|
1949 |
for (int i = 0; i < subWindows.count(); ++i) { |
|
1950 |
mdiArea.activateNextSubWindow(); |
|
1951 |
QMdiSubWindow *window = subWindows.at(i); |
|
1952 |
QCOMPARE(mdiArea.activeSubWindow(), window); |
|
1953 |
QVERIFY(!window->isMaximized()); |
|
1954 |
qApp->processEvents(); |
|
1955 |
} |
|
1956 |
||
1957 |
// Enable 'DontMaximizedSubWindowOnActivation' and maximize the active window. |
|
1958 |
mdiArea.setOption(QMdiArea::DontMaximizeSubWindowOnActivation); |
|
1959 |
mdiArea.activeSubWindow()->showMaximized(); |
|
1960 |
int indexOfMaximized = subWindows.indexOf(mdiArea.activeSubWindow()); |
|
1961 |
||
1962 |
// Verify that windows are not maximized on activation. |
|
1963 |
for (int i = 0; i < subWindows.count(); ++i) { |
|
1964 |
mdiArea.activateNextSubWindow(); |
|
1965 |
QMdiSubWindow *window = subWindows.at(i); |
|
1966 |
QCOMPARE(mdiArea.activeSubWindow(), window); |
|
1967 |
if (indexOfMaximized != i) |
|
1968 |
QVERIFY(!window->isMaximized()); |
|
1969 |
qApp->processEvents(); |
|
1970 |
} |
|
1971 |
QVERIFY(mdiArea.activeSubWindow()->isMaximized()); |
|
1972 |
||
1973 |
// Minimize all windows. |
|
1974 |
foreach (QMdiSubWindow *window, subWindows) { |
|
1975 |
window->showMinimized(); |
|
1976 |
QVERIFY(window->isMinimized()); |
|
1977 |
qApp->processEvents(); |
|
1978 |
} |
|
1979 |
||
1980 |
// Disable 'DontMaximizedSubWindowOnActivation' and maximize the active window. |
|
1981 |
mdiArea.setOption(QMdiArea::DontMaximizeSubWindowOnActivation, false); |
|
1982 |
mdiArea.activeSubWindow()->showMaximized(); |
|
1983 |
||
1984 |
// Verify that minimized windows are maximized on activation. |
|
1985 |
for (int i = 0; i < subWindows.count(); ++i) { |
|
1986 |
mdiArea.activateNextSubWindow(); |
|
1987 |
QMdiSubWindow *window = subWindows.at(i); |
|
1988 |
QCOMPARE(mdiArea.activeSubWindow(), window); |
|
1989 |
QVERIFY(window->isMaximized()); |
|
1990 |
qApp->processEvents(); |
|
1991 |
} |
|
1992 |
||
1993 |
// Verify that activated windows are maximized after closing |
|
1994 |
// the active window |
|
1995 |
for (int i = 0; i < subWindows.count(); ++i) { |
|
1996 |
QVERIFY(mdiArea.activeSubWindow()); |
|
1997 |
QVERIFY(mdiArea.activeSubWindow()->isMaximized()); |
|
1998 |
mdiArea.activeSubWindow()->close(); |
|
1999 |
qApp->processEvents(); |
|
2000 |
} |
|
2001 |
||
2002 |
QVERIFY(!mdiArea.activeSubWindow()); |
|
2003 |
QCOMPARE(mdiArea.subWindowList().size(), 0); |
|
2004 |
||
2005 |
// Verify that new windows are not maximized. |
|
2006 |
mdiArea.addSubWindow(new QWidget)->show(); |
|
2007 |
QVERIFY(mdiArea.activeSubWindow()); |
|
2008 |
QVERIFY(!mdiArea.activeSubWindow()->isMaximized()); |
|
2009 |
} |
|
2010 |
||
2011 |
void tst_QMdiArea::delayedPlacement() |
|
2012 |
{ |
|
2013 |
QMdiArea mdiArea; |
|
2014 |
||
2015 |
QMdiSubWindow *window1 = mdiArea.addSubWindow(new QWidget); |
|
2016 |
QCOMPARE(window1->geometry().topLeft(), QPoint(0, 0)); |
|
2017 |
||
2018 |
QMdiSubWindow *window2 = mdiArea.addSubWindow(new QWidget); |
|
2019 |
QCOMPARE(window2->geometry().topLeft(), QPoint(0, 0)); |
|
2020 |
||
2021 |
QMdiSubWindow *window3 = mdiArea.addSubWindow(new QWidget); |
|
2022 |
QCOMPARE(window3->geometry().topLeft(), QPoint(0, 0)); |
|
2023 |
||
2024 |
mdiArea.resize(window3->minimumSizeHint().width() * 3, 400); |
|
2025 |
mdiArea.show(); |
|
2026 |
#ifdef Q_WS_X11 |
|
2027 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2028 |
#endif |
|
2029 |
||
2030 |
QCOMPARE(window1->geometry().topLeft(), QPoint(0, 0)); |
|
2031 |
QCOMPARE(window2->geometry().topLeft(), window1->geometry().topRight() + QPoint(1, 0)); |
|
2032 |
QCOMPARE(window3->geometry().topLeft(), window2->geometry().topRight() + QPoint(1, 0)); |
|
2033 |
} |
|
2034 |
||
2035 |
void tst_QMdiArea::iconGeometryInMenuBar() |
|
2036 |
{ |
|
2037 |
#if !defined (Q_WS_MAC) && !defined(Q_OS_WINCE) |
|
2038 |
QMainWindow mainWindow; |
|
2039 |
QMenuBar *menuBar = mainWindow.menuBar(); |
|
2040 |
QMdiArea *mdiArea = new QMdiArea; |
|
2041 |
QMdiSubWindow *subWindow = mdiArea->addSubWindow(new QWidget); |
|
2042 |
mainWindow.setCentralWidget(mdiArea); |
|
2043 |
mainWindow.show(); |
|
2044 |
#ifdef Q_WS_X11 |
|
2045 |
qt_x11_wait_for_window_manager(&mainWindow); |
|
2046 |
#endif |
|
2047 |
||
2048 |
subWindow->showMaximized(); |
|
2049 |
QVERIFY(subWindow->isMaximized()); |
|
2050 |
||
2051 |
QWidget *leftCornerWidget = menuBar->cornerWidget(Qt::TopLeftCorner); |
|
2052 |
QVERIFY(leftCornerWidget); |
|
2053 |
int topMargin = (menuBar->height() - leftCornerWidget->height()) / 2; |
|
2054 |
int leftMargin = qApp->style()->pixelMetric(QStyle::PM_MenuBarHMargin) |
|
2055 |
+ qApp->style()->pixelMetric(QStyle::PM_MenuBarPanelWidth); |
|
2056 |
QPoint pos(leftMargin, topMargin); |
|
2057 |
QRect geometry = QStyle::visualRect(qApp->layoutDirection(), menuBar->rect(), |
|
2058 |
QRect(pos, leftCornerWidget->size())); |
|
2059 |
QCOMPARE(leftCornerWidget->geometry(), geometry); |
|
2060 |
#endif |
|
2061 |
} |
|
2062 |
||
2063 |
class EventSpy : public QObject |
|
2064 |
{ |
|
2065 |
public: |
|
2066 |
EventSpy(QObject *object, QEvent::Type event) |
|
2067 |
: eventToSpy(event), _count(0) |
|
2068 |
{ |
|
2069 |
if (object) |
|
2070 |
object->installEventFilter(this); |
|
2071 |
} |
|
2072 |
||
2073 |
int count() const { return _count; } |
|
2074 |
void clear() { _count = 0; } |
|
2075 |
||
2076 |
protected: |
|
2077 |
bool eventFilter(QObject *object, QEvent *event) |
|
2078 |
{ |
|
2079 |
if (event->type() == eventToSpy) |
|
2080 |
++_count; |
|
2081 |
return QObject::eventFilter(object, event); |
|
2082 |
} |
|
2083 |
||
2084 |
private: |
|
2085 |
QEvent::Type eventToSpy; |
|
2086 |
int _count; |
|
2087 |
}; |
|
2088 |
||
2089 |
void tst_QMdiArea::resizeTimer() |
|
2090 |
{ |
|
2091 |
QMdiArea mdiArea; |
|
2092 |
QMdiSubWindow *subWindow = mdiArea.addSubWindow(new QWidget); |
|
2093 |
mdiArea.show(); |
|
2094 |
#ifdef Q_WS_X11 |
|
2095 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2096 |
#endif |
|
2097 |
||
2098 |
#ifndef Q_OS_WINCE |
|
2099 |
int time = 250; |
|
2100 |
#else |
|
2101 |
int time = 1000; |
|
2102 |
#endif |
|
2103 |
||
2104 |
QTest::qWait(time); |
|
2105 |
||
2106 |
EventSpy timerEventSpy(subWindow, QEvent::Timer); |
|
2107 |
QCOMPARE(timerEventSpy.count(), 0); |
|
2108 |
||
2109 |
mdiArea.tileSubWindows(); |
|
2110 |
QTest::qWait(time); // Wait for timer events to occur. |
|
2111 |
QCOMPARE(timerEventSpy.count(), 1); |
|
2112 |
timerEventSpy.clear(); |
|
2113 |
||
2114 |
mdiArea.resize(mdiArea.size() + QSize(2, 2)); |
|
2115 |
QTest::qWait(time); // Wait for timer events to occur. |
|
2116 |
QCOMPARE(timerEventSpy.count(), 1); |
|
2117 |
timerEventSpy.clear(); |
|
2118 |
||
2119 |
// Check that timers are killed. |
|
2120 |
QTest::qWait(time); // Wait for timer events to occur. |
|
2121 |
QCOMPARE(timerEventSpy.count(), 0); |
|
2122 |
} |
|
2123 |
||
2124 |
void tst_QMdiArea::updateScrollBars() |
|
2125 |
{ |
|
2126 |
QMdiArea mdiArea; |
|
2127 |
mdiArea.setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); |
|
2128 |
mdiArea.setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); |
|
2129 |
||
2130 |
QMdiSubWindow *subWindow1 = mdiArea.addSubWindow(new QWidget); |
|
2131 |
QMdiSubWindow *subWindow2 = mdiArea.addSubWindow(new QWidget); |
|
2132 |
||
2133 |
mdiArea.show(); |
|
2134 |
#ifdef Q_WS_X11 |
|
2135 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2136 |
#endif |
|
2137 |
qApp->processEvents(); |
|
2138 |
||
2139 |
QScrollBar *hbar = mdiArea.horizontalScrollBar(); |
|
2140 |
QVERIFY(hbar); |
|
2141 |
QVERIFY(!hbar->isVisible()); |
|
2142 |
||
2143 |
QScrollBar *vbar = mdiArea.verticalScrollBar(); |
|
2144 |
QVERIFY(vbar); |
|
2145 |
QVERIFY(!vbar->isVisible()); |
|
2146 |
||
2147 |
// Move sub-window 2 away. |
|
2148 |
subWindow2->move(10000, 10000); |
|
2149 |
qApp->processEvents(); |
|
2150 |
QVERIFY(hbar->isVisible()); |
|
2151 |
QVERIFY(vbar->isVisible()); |
|
2152 |
||
2153 |
for (int i = 0; i < 2; ++i) { |
|
2154 |
// Maximize sub-window 1 and make sure we don't have any scroll bars. |
|
2155 |
subWindow1->showMaximized(); |
|
2156 |
qApp->processEvents(); |
|
2157 |
QVERIFY(subWindow1->isMaximized()); |
|
2158 |
QVERIFY(!hbar->isVisible()); |
|
2159 |
QVERIFY(!vbar->isVisible()); |
|
2160 |
||
2161 |
// We still shouldn't get any scroll bars. |
|
2162 |
mdiArea.resize(mdiArea.size() - QSize(20, 20)); |
|
2163 |
#ifdef Q_WS_X11 |
|
2164 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2165 |
#endif |
|
2166 |
qApp->processEvents(); |
|
2167 |
QVERIFY(subWindow1->isMaximized()); |
|
2168 |
QVERIFY(!hbar->isVisible()); |
|
2169 |
QVERIFY(!vbar->isVisible()); |
|
2170 |
||
2171 |
// Restore sub-window 1 and make sure we have scroll bars again. |
|
2172 |
subWindow1->showNormal(); |
|
2173 |
qApp->processEvents(); |
|
2174 |
QVERIFY(!subWindow1->isMaximized()); |
|
2175 |
QVERIFY(hbar->isVisible()); |
|
2176 |
QVERIFY(vbar->isVisible()); |
|
2177 |
if (i == 0) { |
|
2178 |
// Now, do the same when the viewport is scrolled. |
|
2179 |
hbar->setValue(1000); |
|
2180 |
vbar->setValue(1000); |
|
2181 |
} |
|
2182 |
} |
|
2183 |
} |
|
2184 |
||
2185 |
void tst_QMdiArea::setActivationOrder_data() |
|
2186 |
{ |
|
2187 |
QTest::addColumn<QMdiArea::WindowOrder>("activationOrder"); |
|
2188 |
QTest::addColumn<int>("subWindowCount"); |
|
2189 |
QTest::addColumn<int>("staysOnTopIndex"); |
|
2190 |
QTest::addColumn<int>("firstActiveIndex"); |
|
2191 |
QTest::addColumn<QList<int> >("expectedActivationIndices"); |
|
2192 |
// The order of expectedCascadeIndices: |
|
2193 |
// window 1 -> (index 0) |
|
2194 |
// window 2 -> (index 1) |
|
2195 |
// window 3 -> (index 2) |
|
2196 |
// .... |
|
2197 |
QTest::addColumn<QList<int> >("expectedCascadeIndices"); |
|
2198 |
||
2199 |
// The order of expectedTileIndices (the same as reading a book LTR). |
|
2200 |
// +--------------------+--------------------+--------------------+ |
|
2201 |
// | window 1 (index 0) | window 2 (index 1) | window 3 (index 2) | |
|
2202 |
// | +--------------------+--------------------+ |
|
2203 |
// | (index 3) | window 4 (index 4) | window 5 (index 5) | |
|
2204 |
// +--------------------------------------------------------------+ |
|
2205 |
QTest::addColumn<QList<int> >("expectedTileIndices"); |
|
2206 |
||
2207 |
QList<int> list; |
|
2208 |
QList<int> list2; |
|
2209 |
QList<int> list3; |
|
2210 |
||
2211 |
list << 2 << 1 << 0 << 1 << 2 << 3 << 4; |
|
2212 |
list2 << 0 << 1 << 2 << 3 << 4; |
|
2213 |
list3 << 1 << 4 << 3 << 1 << 2 << 0; |
|
2214 |
QTest::newRow("CreationOrder") << QMdiArea::CreationOrder << 5 << 3 << 1 << list << list2 << list3; |
|
2215 |
||
2216 |
list = QList<int>(); |
|
2217 |
list << 3 << 1 << 4 << 3 << 1 << 2 << 0; |
|
2218 |
list2 = QList<int>(); |
|
2219 |
list2 << 0 << 2 << 4 << 1 << 3; |
|
2220 |
list3 = QList<int>(); |
|
2221 |
list3 << 1 << 3 << 4 << 1 << 2 << 0; |
|
2222 |
QTest::newRow("StackingOrder") << QMdiArea::StackingOrder << 5 << 3 << 1 << list << list2 << list3; |
|
2223 |
||
2224 |
list = QList<int>(); |
|
2225 |
list << 0 << 1 << 0 << 1 << 4 << 3 << 2; |
|
2226 |
list2 = QList<int>(); |
|
2227 |
list2 << 0 << 2 << 3 << 4 << 1; |
|
2228 |
list3 = QList<int>(); |
|
2229 |
list3 << 1 << 4 << 3 << 1 << 2 << 0; |
|
2230 |
QTest::newRow("ActivationHistoryOrder") << QMdiArea::ActivationHistoryOrder << 5 << 3 << 1 << list << list2 << list3; |
|
2231 |
} |
|
2232 |
||
2233 |
void tst_QMdiArea::setActivationOrder() |
|
2234 |
{ |
|
2235 |
QFETCH(QMdiArea::WindowOrder, activationOrder); |
|
2236 |
QFETCH(int, subWindowCount); |
|
2237 |
QFETCH(int, staysOnTopIndex); |
|
2238 |
QFETCH(int, firstActiveIndex); |
|
2239 |
QFETCH(QList<int>, expectedActivationIndices); |
|
2240 |
QFETCH(QList<int>, expectedCascadeIndices); |
|
2241 |
QFETCH(QList<int>, expectedTileIndices); |
|
2242 |
||
2243 |
// Default order. |
|
2244 |
QMdiArea mdiArea; |
|
2245 |
QCOMPARE(mdiArea.activationOrder(), QMdiArea::CreationOrder); |
|
2246 |
||
2247 |
// New order. |
|
2248 |
mdiArea.setActivationOrder(activationOrder); |
|
2249 |
QCOMPARE(mdiArea.activationOrder(), activationOrder); |
|
2250 |
||
2251 |
QList<QMdiSubWindow *> subWindows; |
|
2252 |
for (int i = 0; i < subWindowCount; ++i) |
|
2253 |
subWindows << mdiArea.addSubWindow(new QPushButton(tr("%1").arg(i))); |
|
2254 |
QCOMPARE(mdiArea.subWindowList(activationOrder), subWindows); |
|
2255 |
||
2256 |
mdiArea.show(); |
|
2257 |
#ifdef Q_WS_X11 |
|
2258 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2259 |
#endif |
|
2260 |
||
2261 |
for (int i = 0; i < subWindows.count(); ++i) { |
|
2262 |
mdiArea.activateNextSubWindow(); |
|
2263 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.at(i)); |
|
2264 |
qApp->processEvents(); |
|
2265 |
} |
|
2266 |
||
2267 |
QMdiSubWindow *staysOnTop = subWindows.at(staysOnTopIndex); |
|
2268 |
staysOnTop->setWindowFlags(staysOnTop->windowFlags() | Qt::WindowStaysOnTopHint); |
|
2269 |
staysOnTop->raise(); |
|
2270 |
||
2271 |
mdiArea.setActiveSubWindow(subWindows.at(firstActiveIndex)); |
|
2272 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.at(firstActiveIndex)); |
|
2273 |
||
2274 |
// Verify the actual arrangement/geometry. |
|
2275 |
mdiArea.tileSubWindows(); |
|
2276 |
QTest::qWait(100); |
|
2277 |
QVERIFY(verifyArrangement(&mdiArea, Tiled, expectedTileIndices)); |
|
2278 |
||
2279 |
mdiArea.cascadeSubWindows(); |
|
2280 |
QVERIFY(verifyArrangement(&mdiArea, Cascaded, expectedCascadeIndices)); |
|
2281 |
QTest::qWait(100); |
|
2282 |
||
2283 |
mdiArea.activateNextSubWindow(); |
|
2284 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.at(expectedActivationIndices.takeFirst())); |
|
2285 |
||
2286 |
mdiArea.activatePreviousSubWindow(); |
|
2287 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.at(expectedActivationIndices.takeFirst())); |
|
2288 |
||
2289 |
mdiArea.activatePreviousSubWindow(); |
|
2290 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.at(expectedActivationIndices.takeFirst())); |
|
2291 |
||
2292 |
for (int i = 0; i < subWindowCount; ++i) { |
|
2293 |
mdiArea.closeActiveSubWindow(); |
|
2294 |
qApp->processEvents(); |
|
2295 |
if (i == subWindowCount - 1) { // Last window closed. |
|
2296 |
QVERIFY(!mdiArea.activeSubWindow()); |
|
2297 |
break; |
|
2298 |
} |
|
2299 |
QVERIFY(mdiArea.activeSubWindow()); |
|
2300 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.at(expectedActivationIndices.takeFirst())); |
|
2301 |
} |
|
2302 |
||
2303 |
QVERIFY(mdiArea.subWindowList(activationOrder).isEmpty()); |
|
2304 |
QVERIFY(expectedActivationIndices.isEmpty()); |
|
2305 |
} |
|
2306 |
||
2307 |
void tst_QMdiArea::tabBetweenSubWindows() |
|
2308 |
{ |
|
2309 |
QMdiArea mdiArea; |
|
2310 |
QList<QMdiSubWindow *> subWindows; |
|
2311 |
for (int i = 0; i < 5; ++i) |
|
2312 |
subWindows << mdiArea.addSubWindow(new QLineEdit); |
|
2313 |
||
2314 |
mdiArea.show(); |
|
2315 |
#ifdef Q_WS_X11 |
|
2316 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2317 |
#endif |
|
2318 |
||
2319 |
qApp->setActiveWindow(&mdiArea); |
|
2320 |
QWidget *focusWidget = subWindows.back()->widget(); |
|
2321 |
QCOMPARE(qApp->focusWidget(), focusWidget); |
|
2322 |
||
2323 |
QSignalSpy spy(&mdiArea, SIGNAL(subWindowActivated(QMdiSubWindow *))); |
|
2324 |
QCOMPARE(spy.count(), 0); |
|
2325 |
||
2326 |
// Walk through the entire list of sub windows. |
|
2327 |
QVERIFY(tabBetweenSubWindowsIn(&mdiArea)); |
|
2328 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.back()); |
|
2329 |
QCOMPARE(spy.count(), 0); |
|
2330 |
||
2331 |
mdiArea.setActiveSubWindow(subWindows.front()); |
|
2332 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.front()); |
|
2333 |
spy.clear(); |
|
2334 |
||
2335 |
// Walk through the entire list of sub windows in the opposite direction (Ctrl-Shift-Tab). |
|
2336 |
QVERIFY(tabBetweenSubWindowsIn(&mdiArea, -1, true)); |
|
2337 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.front()); |
|
2338 |
QCOMPARE(spy.count(), 0); |
|
2339 |
||
2340 |
// Ctrl-Tab-Tab-Tab |
|
2341 |
QVERIFY(tabBetweenSubWindowsIn(&mdiArea, 3)); |
|
2342 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.at(3)); |
|
2343 |
QCOMPARE(spy.count(), 1); |
|
2344 |
||
2345 |
mdiArea.setActiveSubWindow(subWindows.at(1)); |
|
2346 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.at(1)); |
|
2347 |
spy.clear(); |
|
2348 |
||
2349 |
// Quick switch (Ctrl-Tab once) -> switch back to the previously active sub-window. |
|
2350 |
QVERIFY(tabBetweenSubWindowsIn(&mdiArea, 1)); |
|
2351 |
QCOMPARE(mdiArea.activeSubWindow(), subWindows.at(3)); |
|
2352 |
QCOMPARE(spy.count(), 1); |
|
2353 |
} |
|
2354 |
||
2355 |
void tst_QMdiArea::setViewMode() |
|
2356 |
{ |
|
2357 |
QMdiArea mdiArea; |
|
2358 |
||
2359 |
QPixmap iconPixmap(16, 16); |
|
2360 |
iconPixmap.fill(Qt::red); |
|
2361 |
for (int i = 0; i < 5; ++i) { |
|
2362 |
QMdiSubWindow *subWindow = mdiArea.addSubWindow(new QWidget); |
|
2363 |
subWindow->setWindowTitle(QString(QLatin1String("Title %1")).arg(i)); |
|
2364 |
subWindow->setWindowIcon(iconPixmap); |
|
2365 |
} |
|
2366 |
||
2367 |
mdiArea.show(); |
|
2368 |
#ifdef Q_WS_X11 |
|
2369 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2370 |
#endif |
|
2371 |
||
2372 |
QMdiSubWindow *activeSubWindow = mdiArea.activeSubWindow(); |
|
2373 |
const QList<QMdiSubWindow *> subWindows = mdiArea.subWindowList(); |
|
2374 |
||
2375 |
// Default. |
|
2376 |
QVERIFY(!activeSubWindow->isMaximized()); |
|
2377 |
QTabBar *tabBar = qFindChild<QTabBar *>(&mdiArea); |
|
2378 |
QVERIFY(!tabBar); |
|
2379 |
QCOMPARE(mdiArea.viewMode(), QMdiArea::SubWindowView); |
|
2380 |
||
2381 |
// Tabbed view. |
|
2382 |
mdiArea.setViewMode(QMdiArea::TabbedView); |
|
2383 |
QCOMPARE(mdiArea.viewMode(), QMdiArea::TabbedView); |
|
2384 |
tabBar = qFindChild<QTabBar *>(&mdiArea); |
|
2385 |
QVERIFY(tabBar); |
|
2386 |
QVERIFY(tabBar->isVisible()); |
|
2387 |
||
2388 |
QCOMPARE(tabBar->count(), subWindows.count()); |
|
2389 |
QVERIFY(activeSubWindow->isMaximized()); |
|
2390 |
QCOMPARE(tabBar->currentIndex(), subWindows.indexOf(activeSubWindow)); |
|
2391 |
||
2392 |
// Check that tabIcon and tabText are set properly. |
|
2393 |
for (int i = 0; i < subWindows.size(); ++i) { |
|
2394 |
QMdiSubWindow *subWindow = subWindows.at(i); |
|
2395 |
QCOMPARE(tabBar->tabText(i), subWindow->windowTitle()); |
|
2396 |
QCOMPARE(tabBar->tabIcon(i), subWindow->windowIcon()); |
|
2397 |
} |
|
2398 |
||
2399 |
// Check that tabText and tabIcon are updated. |
|
2400 |
activeSubWindow->setWindowTitle(QLatin1String("Dude, I want another window title")); |
|
2401 |
QCOMPARE(tabBar->tabText(tabBar->currentIndex()), activeSubWindow->windowTitle()); |
|
2402 |
iconPixmap.fill(Qt::green); |
|
2403 |
activeSubWindow->setWindowIcon(iconPixmap); |
|
2404 |
QCOMPARE(tabBar->tabIcon(tabBar->currentIndex()), activeSubWindow->windowIcon()); |
|
2405 |
||
2406 |
// If there's an empty window title, tabText should return "(Untitled)" (as in firefox). |
|
2407 |
activeSubWindow->setWindowTitle(QString()); |
|
2408 |
QCOMPARE(tabBar->tabText(tabBar->currentIndex()), QLatin1String("(Untitled)")); |
|
2409 |
||
2410 |
// If there's no window icon, tabIcon should return ... an empty icon :) |
|
2411 |
activeSubWindow->setWindowIcon(QIcon()); |
|
2412 |
QCOMPARE(tabBar->tabIcon(tabBar->currentIndex()), QIcon()); |
|
2413 |
||
2414 |
// Check that the current tab changes when activating another sub-window. |
|
2415 |
for (int i = 0; i < subWindows.size(); ++i) { |
|
2416 |
mdiArea.activateNextSubWindow(); |
|
2417 |
activeSubWindow = mdiArea.activeSubWindow(); |
|
2418 |
QCOMPARE(tabBar->currentIndex(), subWindows.indexOf(activeSubWindow)); |
|
2419 |
} |
|
2420 |
||
2421 |
activeSubWindow = mdiArea.activeSubWindow(); |
|
2422 |
const int tabIndex = tabBar->currentIndex(); |
|
2423 |
||
2424 |
// The current tab should not change when the sub-window is hidden. |
|
2425 |
activeSubWindow->hide(); |
|
2426 |
QCOMPARE(tabBar->currentIndex(), tabIndex); |
|
2427 |
activeSubWindow->show(); |
|
2428 |
QCOMPARE(tabBar->currentIndex(), tabIndex); |
|
2429 |
||
2430 |
// Disable the tab when the sub-window is hidden and another sub-window is activated. |
|
2431 |
activeSubWindow->hide(); |
|
2432 |
mdiArea.activateNextSubWindow(); |
|
2433 |
QVERIFY(tabBar->currentIndex() != tabIndex); |
|
2434 |
QVERIFY(!tabBar->isTabEnabled(tabIndex)); |
|
2435 |
||
2436 |
// Enable it again. |
|
2437 |
activeSubWindow->show(); |
|
2438 |
QCOMPARE(tabBar->currentIndex(), tabIndex); |
|
2439 |
QVERIFY(tabBar->isTabEnabled(tabIndex)); |
|
2440 |
||
2441 |
// Remove sub-windows and make sure the tab is removed. |
|
2442 |
foreach (QMdiSubWindow *subWindow, subWindows) { |
|
2443 |
if (subWindow != activeSubWindow) |
|
2444 |
mdiArea.removeSubWindow(subWindow); |
|
2445 |
} |
|
2446 |
QCOMPARE(tabBar->count(), 1); |
|
2447 |
||
2448 |
// Go back to default (QMdiArea::SubWindowView). |
|
2449 |
mdiArea.setViewMode(QMdiArea::SubWindowView); |
|
2450 |
QVERIFY(!activeSubWindow->isMaximized()); |
|
2451 |
tabBar = qFindChild<QTabBar *>(&mdiArea); |
|
2452 |
QVERIFY(!tabBar); |
|
2453 |
QCOMPARE(mdiArea.viewMode(), QMdiArea::SubWindowView); |
|
2454 |
} |
|
2455 |
||
2456 |
void tst_QMdiArea::setTabShape() |
|
2457 |
{ |
|
2458 |
QMdiArea mdiArea; |
|
2459 |
mdiArea.addSubWindow(new QWidget); |
|
2460 |
mdiArea.show(); |
|
2461 |
#ifdef Q_WS_X11 |
|
2462 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2463 |
#endif |
|
2464 |
||
2465 |
// Default. |
|
2466 |
QCOMPARE(mdiArea.tabShape(), QTabWidget::Rounded); |
|
2467 |
||
2468 |
// Triangular. |
|
2469 |
mdiArea.setTabShape(QTabWidget::Triangular); |
|
2470 |
QCOMPARE(mdiArea.tabShape(), QTabWidget::Triangular); |
|
2471 |
||
2472 |
mdiArea.setViewMode(QMdiArea::TabbedView); |
|
2473 |
||
2474 |
QTabBar *tabBar = qFindChild<QTabBar *>(&mdiArea); |
|
2475 |
QVERIFY(tabBar); |
|
2476 |
QCOMPARE(tabBar->shape(), QTabBar::TriangularNorth); |
|
2477 |
||
2478 |
// Back to default (Rounded). |
|
2479 |
mdiArea.setTabShape(QTabWidget::Rounded); |
|
2480 |
QCOMPARE(mdiArea.tabShape(), QTabWidget::Rounded); |
|
2481 |
QCOMPARE(tabBar->shape(), QTabBar::RoundedNorth); |
|
2482 |
} |
|
2483 |
||
2484 |
void tst_QMdiArea::setTabPosition_data() |
|
2485 |
{ |
|
2486 |
QTest::addColumn<QTabWidget::TabPosition>("tabPosition"); |
|
2487 |
QTest::addColumn<bool>("hasLeftMargin"); |
|
2488 |
QTest::addColumn<bool>("hasTopMargin"); |
|
2489 |
QTest::addColumn<bool>("hasRightMargin"); |
|
2490 |
QTest::addColumn<bool>("hasBottomMargin"); |
|
2491 |
||
2492 |
QTest::newRow("North") << QTabWidget::North << false << true << false << false; |
|
2493 |
QTest::newRow("South") << QTabWidget::South << false << false << false << true; |
|
2494 |
QTest::newRow("East") << QTabWidget::East << false << false << true << false; |
|
2495 |
QTest::newRow("West") << QTabWidget::West << true << false << false << false; |
|
2496 |
} |
|
2497 |
||
2498 |
void tst_QMdiArea::setTabPosition() |
|
2499 |
{ |
|
2500 |
QFETCH(QTabWidget::TabPosition, tabPosition); |
|
2501 |
QFETCH(bool, hasLeftMargin); |
|
2502 |
QFETCH(bool, hasTopMargin); |
|
2503 |
QFETCH(bool, hasRightMargin); |
|
2504 |
QFETCH(bool, hasBottomMargin); |
|
2505 |
||
2506 |
QMdiArea mdiArea; |
|
2507 |
mdiArea.addSubWindow(new QWidget); |
|
2508 |
mdiArea.show(); |
|
2509 |
#ifdef Q_WS_X11 |
|
2510 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2511 |
#endif |
|
2512 |
||
2513 |
// Make sure there are no margins. |
|
2514 |
mdiArea.setContentsMargins(0, 0, 0, 0); |
|
2515 |
||
2516 |
// Default. |
|
2517 |
QCOMPARE(mdiArea.tabPosition(), QTabWidget::North); |
|
2518 |
mdiArea.setViewMode(QMdiArea::TabbedView); |
|
2519 |
QTabBar *tabBar = qFindChild<QTabBar *>(&mdiArea); |
|
2520 |
QVERIFY(tabBar); |
|
2521 |
QCOMPARE(tabBar->shape(), QTabBar::RoundedNorth); |
|
2522 |
||
2523 |
// New position. |
|
2524 |
mdiArea.setTabPosition(tabPosition); |
|
2525 |
QCOMPARE(mdiArea.tabPosition(), tabPosition); |
|
2526 |
QCOMPARE(tabBar->shape(), tabBarShapeFrom(QTabWidget::Rounded, tabPosition)); |
|
2527 |
||
2528 |
const Qt::LayoutDirection originalLayoutDirection = qApp->layoutDirection(); |
|
2529 |
||
2530 |
// Check that we have correct geometry in both RightToLeft and LeftToRight. |
|
2531 |
for (int i = 0; i < 2; ++i) { |
|
2532 |
// Check viewportMargins. |
|
2533 |
const QRect viewportGeometry = mdiArea.viewport()->geometry(); |
|
2534 |
const int left = viewportGeometry.left(); |
|
2535 |
const int top = viewportGeometry.y(); |
|
2536 |
const int right = mdiArea.width() - viewportGeometry.width(); |
|
2537 |
const int bottom = mdiArea.height() - viewportGeometry.height(); |
|
2538 |
||
2539 |
const QSize sizeHint = tabBar->sizeHint(); |
|
2540 |
||
2541 |
if (hasLeftMargin) |
|
2542 |
QCOMPARE(qApp->isLeftToRight() ? left : right, sizeHint.width()); |
|
2543 |
if (hasRightMargin) |
|
2544 |
QCOMPARE(qApp->isLeftToRight() ? right : left, sizeHint.width()); |
|
2545 |
if (hasTopMargin || hasBottomMargin) |
|
2546 |
QCOMPARE(hasTopMargin ? top : bottom, sizeHint.height()); |
|
2547 |
||
2548 |
// Check actual tab bar geometry. |
|
2549 |
const QRegion expectedTabBarGeometry = QRegion(mdiArea.rect()).subtracted(viewportGeometry); |
|
2550 |
QVERIFY(!expectedTabBarGeometry.isEmpty()); |
|
2551 |
QCOMPARE(QRegion(tabBar->geometry()), expectedTabBarGeometry); |
|
2552 |
||
2553 |
if (i == 0) |
|
2554 |
qApp->setLayoutDirection(originalLayoutDirection == Qt::LeftToRight ? Qt::RightToLeft : Qt::LeftToRight); |
|
2555 |
qApp->processEvents(); |
|
2556 |
} |
|
2557 |
||
2558 |
qApp->setLayoutDirection(originalLayoutDirection); |
|
2559 |
} |
|
2560 |
||
2561 |
#if defined(Q_WS_WIN) || defined(Q_WS_X11) |
|
2562 |
void tst_QMdiArea::nativeSubWindows() |
|
2563 |
{ |
|
2564 |
{ // Add native widgets after show. |
|
2565 |
QMdiArea mdiArea; |
|
2566 |
mdiArea.addSubWindow(new QWidget); |
|
2567 |
mdiArea.addSubWindow(new QWidget); |
|
2568 |
mdiArea.show(); |
|
2569 |
#ifdef Q_WS_X11 |
|
2570 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2571 |
#endif |
|
2572 |
||
2573 |
// No native widgets. |
|
2574 |
QVERIFY(!mdiArea.viewport()->internalWinId()); |
|
2575 |
foreach (QMdiSubWindow *subWindow, mdiArea.subWindowList()) |
|
2576 |
QVERIFY(!subWindow->internalWinId()); |
|
2577 |
||
2578 |
QWidget *nativeWidget = new QWidget; |
|
2579 |
QVERIFY(nativeWidget->winId()); // enforce native window. |
|
2580 |
mdiArea.addSubWindow(nativeWidget); |
|
2581 |
||
2582 |
// The viewport and all the sub-windows must be native. |
|
2583 |
QVERIFY(mdiArea.viewport()->internalWinId()); |
|
2584 |
foreach (QMdiSubWindow *subWindow, mdiArea.subWindowList()) |
|
2585 |
QVERIFY(subWindow->internalWinId()); |
|
2586 |
||
2587 |
// Add a non-native widget. This should become native. |
|
2588 |
QMdiSubWindow *subWindow = new QMdiSubWindow; |
|
2589 |
subWindow->setWidget(new QWidget); |
|
2590 |
QVERIFY(!subWindow->internalWinId()); |
|
2591 |
mdiArea.addSubWindow(subWindow); |
|
2592 |
QVERIFY(subWindow->internalWinId()); |
|
2593 |
} |
|
2594 |
||
2595 |
{ // Add native widgets before show. |
|
2596 |
QMdiArea mdiArea; |
|
2597 |
mdiArea.addSubWindow(new QWidget); |
|
2598 |
QWidget *nativeWidget = new QWidget; |
|
2599 |
(void)nativeWidget->winId(); |
|
2600 |
mdiArea.addSubWindow(nativeWidget); |
|
2601 |
mdiArea.show(); |
|
2602 |
#ifdef Q_WS_X11 |
|
2603 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2604 |
#endif |
|
2605 |
||
2606 |
// The viewport and all the sub-windows must be native. |
|
2607 |
QVERIFY(mdiArea.viewport()->internalWinId()); |
|
2608 |
foreach (QMdiSubWindow *subWindow, mdiArea.subWindowList()) |
|
2609 |
QVERIFY(subWindow->internalWinId()); |
|
2610 |
} |
|
2611 |
||
2612 |
{ // Make a sub-window native *after* it's added to the area. |
|
2613 |
QMdiArea mdiArea; |
|
2614 |
mdiArea.addSubWindow(new QWidget); |
|
2615 |
mdiArea.addSubWindow(new QWidget); |
|
2616 |
mdiArea.show(); |
|
2617 |
#ifdef Q_WS_X11 |
|
2618 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2619 |
#endif |
|
2620 |
||
2621 |
QMdiSubWindow *nativeSubWindow = mdiArea.subWindowList().last(); |
|
2622 |
QVERIFY(!nativeSubWindow->internalWinId()); |
|
2623 |
(void)nativeSubWindow->winId(); |
|
2624 |
||
2625 |
// All the sub-windows should be native at this point |
|
2626 |
QVERIFY(mdiArea.viewport()->internalWinId()); |
|
2627 |
foreach (QMdiSubWindow *subWindow, mdiArea.subWindowList()) |
|
2628 |
QVERIFY(subWindow->internalWinId()); |
|
2629 |
} |
|
2630 |
||
2631 |
#ifndef QT_NO_OPENGL |
|
2632 |
{ |
|
2633 |
if (!QGLFormat::hasOpenGL()) |
|
2634 |
QSKIP("QGL not supported on this platform", SkipAll); |
|
2635 |
||
2636 |
QMdiArea mdiArea; |
|
2637 |
QGLWidget *glViewport = new QGLWidget; |
|
2638 |
mdiArea.setViewport(glViewport); |
|
2639 |
mdiArea.addSubWindow(new QWidget); |
|
2640 |
mdiArea.addSubWindow(new QWidget); |
|
2641 |
mdiArea.show(); |
|
2642 |
#ifdef Q_WS_X11 |
|
2643 |
qt_x11_wait_for_window_manager(&mdiArea); |
|
2644 |
#endif |
|
2645 |
||
2646 |
const QGLContext *context = glViewport->context(); |
|
2647 |
if (!context || !context->isValid()) |
|
2648 |
QSKIP("QGL is broken, cannot continue test", SkipAll); |
|
2649 |
||
2650 |
// The viewport and all the sub-windows must be native. |
|
2651 |
QVERIFY(mdiArea.viewport()->internalWinId()); |
|
2652 |
foreach (QMdiSubWindow *subWindow, mdiArea.subWindowList()) |
|
2653 |
QVERIFY(subWindow->internalWinId()); |
|
2654 |
} |
|
2655 |
#endif |
|
2656 |
} |
|
2657 |
#endif |
|
2658 |
||
2659 |
void tst_QMdiArea::task_209615() |
|
2660 |
{ |
|
2661 |
QTabWidget tabWidget; |
|
2662 |
QMdiArea *mdiArea1 = new QMdiArea; |
|
2663 |
QMdiArea *mdiArea2 = new QMdiArea; |
|
2664 |
QMdiSubWindow *subWindow = mdiArea1->addSubWindow(new QLineEdit); |
|
2665 |
||
2666 |
tabWidget.addTab(mdiArea1, QLatin1String("1")); |
|
2667 |
tabWidget.addTab(mdiArea2, QLatin1String("2")); |
|
2668 |
tabWidget.show(); |
|
2669 |
||
2670 |
mdiArea1->removeSubWindow(subWindow); |
|
2671 |
mdiArea2->addSubWindow(subWindow); |
|
2672 |
||
2673 |
// Please do not assert/crash. |
|
2674 |
tabWidget.setCurrentIndex(1); |
|
2675 |
} |
|
2676 |
||
2677 |
void tst_QMdiArea::task_236750() |
|
2678 |
{ |
|
2679 |
QMdiArea mdiArea; |
|
2680 |
QMdiSubWindow *subWindow = mdiArea.addSubWindow(new QTextEdit); |
|
2681 |
mdiArea.show(); |
|
2682 |
||
2683 |
subWindow->setWindowFlags(subWindow->windowFlags() | Qt::FramelessWindowHint); |
|
2684 |
// Please do not crash (floating point exception). |
|
2685 |
subWindow->showMinimized(); |
|
2686 |
} |
|
2687 |
||
2688 |
QTEST_MAIN(tst_QMdiArea) |
|
2689 |
#include "tst_qmdiarea.moc" |
|
2690 |