|
1 /**************************************************************************** |
|
2 ** |
|
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
|
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 #include <qgraphicswidget.h> |
|
45 #include <qgraphicsscene.h> |
|
46 #include <qgraphicssceneevent.h> |
|
47 #include <qgraphicsview.h> |
|
48 #include <qstyleoption.h> |
|
49 #include <qgraphicslinearlayout.h> |
|
50 #include <qcleanlooksstyle.h> |
|
51 #include <qlineedit.h> |
|
52 #include <qboxlayout.h> |
|
53 #include <qaction.h> |
|
54 #include <qwidgetaction.h> |
|
55 #include "../../shared/util.h" |
|
56 |
|
57 |
|
58 class EventSpy : public QObject |
|
59 { |
|
60 Q_OBJECT |
|
61 public: |
|
62 EventSpy(QObject *watched, QEvent::Type type) |
|
63 : _count(0), spied(type) |
|
64 { |
|
65 watched->installEventFilter(this); |
|
66 } |
|
67 |
|
68 int count() const { return _count; } |
|
69 |
|
70 protected: |
|
71 bool eventFilter(QObject *watched, QEvent *event) |
|
72 { |
|
73 Q_UNUSED(watched); |
|
74 if (event->type() == spied) |
|
75 ++_count; |
|
76 return false; |
|
77 } |
|
78 |
|
79 int _count; |
|
80 QEvent::Type spied; |
|
81 }; |
|
82 |
|
83 #ifndef QT_NO_STYLE_CLEANLOOKS |
|
84 class tst_QGraphicsWidget : public QObject { |
|
85 Q_OBJECT |
|
86 |
|
87 public slots: |
|
88 void initTestCase(); |
|
89 void cleanupTestCase(); |
|
90 void init(); |
|
91 void cleanup(); |
|
92 |
|
93 private slots: |
|
94 void qgraphicswidget(); |
|
95 |
|
96 void activation(); |
|
97 void boundingRect_data(); |
|
98 void boundingRect(); |
|
99 void dumpFocusChain_data(); |
|
100 void dumpFocusChain(); |
|
101 void focusWidget_data(); |
|
102 void focusWidget(); |
|
103 void focusWidget2(); |
|
104 void focusPolicy_data(); |
|
105 void focusPolicy(); |
|
106 void font_data(); |
|
107 void font(); |
|
108 void fontPropagation(); |
|
109 void fontPropagationWidgetItemWidget(); |
|
110 void fontPropagationSceneChange(); |
|
111 void geometry_data(); |
|
112 void geometry(); |
|
113 void getContentsMargins_data(); |
|
114 void getContentsMargins(); |
|
115 void initStyleOption_data(); |
|
116 void initStyleOption(); |
|
117 void layout_data(); |
|
118 void layout(); |
|
119 void layoutDirection_data(); |
|
120 void layoutDirection(); |
|
121 void paint_data(); |
|
122 void paint(); |
|
123 void palettePropagation(); |
|
124 void parentWidget_data(); |
|
125 void parentWidget(); |
|
126 void resize_data(); |
|
127 void resize(); |
|
128 void setAttribute_data(); |
|
129 void setAttribute(); |
|
130 void setStyle_data(); |
|
131 void setStyle(); |
|
132 void setTabOrder_data(); |
|
133 void setTabOrder(); |
|
134 void setTabOrderAndReparent(); |
|
135 void topLevelWidget_data(); |
|
136 void topLevelWidget(); |
|
137 void unsetLayoutDirection_data(); |
|
138 void unsetLayoutDirection(); |
|
139 void focusNextPrevChild_data(); |
|
140 void focusNextPrevChild(); |
|
141 void verifyFocusChain(); |
|
142 void updateFocusChainWhenChildDie(); |
|
143 void sizeHint_data(); |
|
144 void sizeHint(); |
|
145 void consistentPosSizeGeometry_data(); |
|
146 void consistentPosSizeGeometry(); |
|
147 void setSizes_data(); |
|
148 void setSizes(); |
|
149 void closePopupOnOutsideClick(); |
|
150 void defaultSize(); |
|
151 void explicitMouseGrabber(); |
|
152 void implicitMouseGrabber(); |
|
153 void doubleClickAfterExplicitMouseGrab(); |
|
154 void popupMouseGrabber(); |
|
155 void windowFlags_data(); |
|
156 void windowFlags(); |
|
157 void shortcutsDeletion(); |
|
158 void painterStateProtectionOnWindowFrame(); |
|
159 void ensureClipping(); |
|
160 void widgetSendsGeometryChanges(); |
|
161 void respectHFW(); |
|
162 void addChildInpolishEvent(); |
|
163 |
|
164 // Task fixes |
|
165 void task236127_bspTreeIndexFails(); |
|
166 void task243004_setStyleCrash(); |
|
167 void task250119_shortcutContext(); |
|
168 }; |
|
169 |
|
170 |
|
171 static void sendMouseMove(QWidget *widget, const QPoint &point, Qt::MouseButton button = Qt::NoButton, Qt::MouseButtons buttons = 0) |
|
172 { |
|
173 QTest::mouseMove(widget, point); |
|
174 QMouseEvent event(QEvent::MouseMove, point, button, buttons, 0); |
|
175 QApplication::sendEvent(widget, &event); |
|
176 } |
|
177 |
|
178 // Subclass that exposes the protected functions. |
|
179 class SubQGraphicsWidget : public QGraphicsWidget { |
|
180 public: |
|
181 SubQGraphicsWidget(QGraphicsItem *parent = 0, Qt::WindowFlags windowFlags = 0) |
|
182 : QGraphicsWidget(parent, windowFlags), eventCount(0) |
|
183 { } |
|
184 |
|
185 void initStyleOption(QStyleOption *option) |
|
186 { QGraphicsWidget::initStyleOption(option); } |
|
187 |
|
188 void call_changeEvent(QEvent* event) |
|
189 { return QGraphicsWidget::changeEvent(event); } |
|
190 |
|
191 bool call_event(QEvent *e) |
|
192 { return event(e); } |
|
193 |
|
194 void call_focusInEvent(QFocusEvent* event) |
|
195 { return QGraphicsWidget::focusInEvent(event); } |
|
196 |
|
197 bool call_focusNextPrevChild(bool next) |
|
198 { return QGraphicsWidget::focusNextPrevChild(next); } |
|
199 |
|
200 void call_focusOutEvent(QFocusEvent* event) |
|
201 { return QGraphicsWidget::focusOutEvent(event); } |
|
202 |
|
203 void call_hideEvent(QHideEvent* event) |
|
204 { return QGraphicsWidget::hideEvent(event); } |
|
205 |
|
206 QVariant call_itemChange(QGraphicsItem::GraphicsItemChange change, QVariant const& value) |
|
207 { return QGraphicsWidget::itemChange(change, value); } |
|
208 |
|
209 void call_moveEvent(QGraphicsSceneMoveEvent* event) |
|
210 { return QGraphicsWidget::moveEvent(event); } |
|
211 |
|
212 void call_polishEvent() |
|
213 { return QGraphicsWidget::polishEvent(); } |
|
214 |
|
215 QVariant call_propertyChange(QString const& propertyName, QVariant const& value) |
|
216 { return QGraphicsWidget::propertyChange(propertyName, value); } |
|
217 |
|
218 void call_resizeEvent(QGraphicsSceneResizeEvent* event) |
|
219 { return QGraphicsWidget::resizeEvent(event); } |
|
220 |
|
221 bool call_sceneEvent(QEvent* event) |
|
222 { return QGraphicsWidget::sceneEvent(event); } |
|
223 |
|
224 void call_showEvent(QShowEvent* event) |
|
225 { return QGraphicsWidget::showEvent(event); } |
|
226 |
|
227 QSizeF call_sizeHint(Qt::SizeHint which, QSizeF const& constraint = QSizeF()) const |
|
228 { return QGraphicsWidget::sizeHint(which, constraint); } |
|
229 |
|
230 void call_updateGeometry() |
|
231 { return QGraphicsWidget::updateGeometry(); } |
|
232 |
|
233 int eventCount; |
|
234 Qt::LayoutDirection m_painterLayoutDirection; |
|
235 |
|
236 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
|
237 { |
|
238 m_painterLayoutDirection = painter->layoutDirection(); |
|
239 QGraphicsWidget::paint(painter, option, widget); |
|
240 if (hasFocus()) { |
|
241 painter->setPen(Qt::DotLine); |
|
242 painter->drawRect(rect()); |
|
243 } |
|
244 //painter->drawText(QPointF(0,15), data(0).toString()); |
|
245 } |
|
246 |
|
247 protected: |
|
248 bool event(QEvent *event) |
|
249 { |
|
250 eventCount++; |
|
251 return QGraphicsWidget::event(event); |
|
252 } |
|
253 }; |
|
254 |
|
255 // This will be called before the first test function is executed. |
|
256 // It is only called once. |
|
257 void tst_QGraphicsWidget::initTestCase() |
|
258 { |
|
259 } |
|
260 |
|
261 // This will be called after the last test function is executed. |
|
262 // It is only called once. |
|
263 void tst_QGraphicsWidget::cleanupTestCase() |
|
264 { |
|
265 } |
|
266 |
|
267 // This will be called before each test function is executed. |
|
268 void tst_QGraphicsWidget::init() |
|
269 { |
|
270 } |
|
271 |
|
272 // This will be called after every test function. |
|
273 void tst_QGraphicsWidget::cleanup() |
|
274 { |
|
275 } |
|
276 |
|
277 class SizeHinter : public QGraphicsWidget |
|
278 { |
|
279 public: |
|
280 SizeHinter(QGraphicsItem *parent = 0, Qt::WindowFlags wFlags = 0, |
|
281 const QSizeF &min = QSizeF(5,5), |
|
282 const QSizeF &pref = QSizeF(50, 50), |
|
283 const QSizeF &max = QSizeF(500, 500)) |
|
284 : QGraphicsWidget(parent, wFlags) |
|
285 { |
|
286 m_sizes[Qt::MinimumSize] = min; |
|
287 m_sizes[Qt::PreferredSize] = pref; |
|
288 m_sizes[Qt::MaximumSize] = max; |
|
289 |
|
290 } |
|
291 void setSizeHint(Qt::SizeHint which, const QSizeF &newSizeHint) |
|
292 { |
|
293 m_sizes[which] = newSizeHint; |
|
294 } |
|
295 |
|
296 protected: |
|
297 QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const |
|
298 { |
|
299 Q_UNUSED(constraint); |
|
300 return m_sizes[which]; |
|
301 } |
|
302 private: |
|
303 QSizeF m_sizes[4]; |
|
304 }; |
|
305 |
|
306 void tst_QGraphicsWidget::qgraphicswidget() |
|
307 { |
|
308 SubQGraphicsWidget widget; |
|
309 QVERIFY(widget.isVisible()); |
|
310 |
|
311 QVERIFY(!widget.isWindow()); |
|
312 QCOMPARE(widget.boundingRect(), QRectF(0, 0, 0, 0)); |
|
313 QCOMPARE(widget.focusWidget(), (QGraphicsWidget*)0); |
|
314 QCOMPARE(widget.focusPolicy(), Qt::NoFocus); |
|
315 QCOMPARE(widget.font(), QFont()); |
|
316 QCOMPARE(widget.geometry(), QRectF(widget.pos(), widget.size())); |
|
317 QCOMPARE(widget.layout(), (QGraphicsLayout*)0); |
|
318 QCOMPARE(widget.layoutDirection(), Qt::LeftToRight); |
|
319 QCOMPARE(widget.palette(), QPalette()); |
|
320 QCOMPARE(widget.parentWidget(), (QGraphicsWidget*)0); |
|
321 QCOMPARE(widget.rect(), QRectF(QPointF(), widget.size())); |
|
322 QCOMPARE(widget.size(), QSizeF(0, 0)); |
|
323 QVERIFY(widget.style() != (QStyle*)0); |
|
324 QCOMPARE(widget.testAttribute(Qt::WA_AcceptDrops), false); |
|
325 QCOMPARE(widget.topLevelWidget(), (QGraphicsWidget*)&widget); |
|
326 QCOMPARE(widget.type(), (int)QGraphicsWidget::Type); |
|
327 QCOMPARE(widget.call_propertyChange(QString(), QVariant()), QVariant()); |
|
328 widget.call_sizeHint(Qt::PreferredSize, QSizeF()); |
|
329 |
|
330 QGraphicsScene scene; |
|
331 QGraphicsWidget *parent = new QGraphicsWidget; |
|
332 SizeHinter *child = new SizeHinter(parent); |
|
333 |
|
334 QCOMPARE(child->minimumSize(), QSizeF(5, 5)); |
|
335 } |
|
336 |
|
337 void tst_QGraphicsWidget::activation() |
|
338 { |
|
339 QGraphicsWidget *widget = new QGraphicsWidget; |
|
340 QGraphicsWidget *window1 = new QGraphicsWidget(0, Qt::Window); |
|
341 QGraphicsWidget *window2 = new QGraphicsWidget(0, Qt::Window); |
|
342 QVERIFY(!widget->isActiveWindow()); |
|
343 QVERIFY(!window1->isActiveWindow()); |
|
344 QVERIFY(!window2->isActiveWindow()); |
|
345 |
|
346 QGraphicsScene scene; |
|
347 scene.addItem(widget); |
|
348 scene.addItem(window1); |
|
349 scene.addItem(window2); |
|
350 |
|
351 QVERIFY(!widget->isActiveWindow()); |
|
352 QVERIFY(!window1->isActiveWindow()); |
|
353 QVERIFY(!window2->isActiveWindow()); |
|
354 |
|
355 QEvent activateEvent(QEvent::WindowActivate); |
|
356 QApplication::sendEvent(&scene, &activateEvent); |
|
357 |
|
358 QVERIFY(!widget->isActiveWindow()); |
|
359 QVERIFY(window1->isActiveWindow()); |
|
360 QVERIFY(!window2->isActiveWindow()); |
|
361 |
|
362 scene.setActiveWindow(window1); |
|
363 QVERIFY(!widget->isActiveWindow()); |
|
364 QVERIFY(window1->isActiveWindow()); |
|
365 QVERIFY(!window2->isActiveWindow()); |
|
366 |
|
367 QEvent deactivateEvent(QEvent::WindowDeactivate); |
|
368 QApplication::sendEvent(&scene, &deactivateEvent); |
|
369 |
|
370 QVERIFY(!widget->isActiveWindow()); |
|
371 QVERIFY(!window1->isActiveWindow()); |
|
372 QVERIFY(!window2->isActiveWindow()); |
|
373 } |
|
374 |
|
375 void tst_QGraphicsWidget::boundingRect_data() |
|
376 { |
|
377 QTest::addColumn<QSizeF>("size"); |
|
378 QTest::newRow("null") << QSizeF(0, 0); |
|
379 QTest::newRow("avg") << QSizeF(10, 10); |
|
380 } |
|
381 |
|
382 // QRectF boundingRect() const public |
|
383 void tst_QGraphicsWidget::boundingRect() |
|
384 { |
|
385 QFETCH(QSizeF, size); |
|
386 SubQGraphicsWidget widget; |
|
387 widget.resize(size); |
|
388 QCOMPARE(widget.rect(), QRectF(QPointF(), size)); |
|
389 QCOMPARE(widget.boundingRect(), QRectF(QPointF(0, 0), size)); |
|
390 } |
|
391 |
|
392 void tst_QGraphicsWidget::dumpFocusChain_data() |
|
393 { |
|
394 QTest::addColumn<bool>("scene"); |
|
395 QTest::addColumn<int>("children"); |
|
396 QTest::addColumn<bool>("setFocus"); |
|
397 QTest::newRow("empty world") << false << 0 << false; |
|
398 QTest::newRow("one world") << true << 2 << false; |
|
399 QTest::newRow("one world w/focus") << true << 2 << true; |
|
400 } |
|
401 |
|
402 // void dumpFocusChain(QGraphicsScene* scene) public (static) |
|
403 void tst_QGraphicsWidget::dumpFocusChain() |
|
404 { |
|
405 // ### this test is very strange... |
|
406 QFETCH(bool, scene); |
|
407 SubQGraphicsWidget *parent = new SubQGraphicsWidget; |
|
408 QGraphicsScene *theScene = 0; |
|
409 if (scene) { |
|
410 theScene = new QGraphicsScene(this); |
|
411 theScene->addItem(parent); |
|
412 } |
|
413 QFETCH(int, children); |
|
414 QFETCH(bool, setFocus); |
|
415 for (int i = 0; i < children; ++i) { |
|
416 SubQGraphicsWidget *widget = new SubQGraphicsWidget(parent); |
|
417 if (setFocus) { |
|
418 widget->setFlag(QGraphicsItem::ItemIsFocusable, true); |
|
419 if (scene) |
|
420 theScene->setFocusItem(widget); |
|
421 } |
|
422 } |
|
423 |
|
424 if (!scene) |
|
425 delete parent; |
|
426 } |
|
427 |
|
428 void tst_QGraphicsWidget::focusWidget_data() |
|
429 { |
|
430 QTest::addColumn<int>("childCount"); |
|
431 QTest::addColumn<int>("childWithFocus"); |
|
432 QTest::newRow("none") << 0 << 0; |
|
433 QTest::newRow("first") << 3 << 0; |
|
434 QTest::newRow("last") << 3 << 2; |
|
435 } |
|
436 |
|
437 // QGraphicsWidget* focusWidget() const public |
|
438 void tst_QGraphicsWidget::focusWidget() |
|
439 { |
|
440 SubQGraphicsWidget *parent = new SubQGraphicsWidget; |
|
441 QCOMPARE(parent->focusWidget(), (QGraphicsWidget *)0); |
|
442 QGraphicsScene scene; |
|
443 QEvent windowActivate(QEvent::WindowActivate); |
|
444 qApp->sendEvent(&scene, &windowActivate); |
|
445 scene.addItem(parent); |
|
446 |
|
447 QFETCH(int, childCount); |
|
448 QList<SubQGraphicsWidget *> children; |
|
449 for (int i = 0; i < childCount; ++i) { |
|
450 SubQGraphicsWidget *widget = new SubQGraphicsWidget(parent); |
|
451 widget->setFlag(QGraphicsItem::ItemIsFocusable, true); |
|
452 children.append(widget); |
|
453 } |
|
454 if (childCount > 0) { |
|
455 QFETCH(int, childWithFocus); |
|
456 SubQGraphicsWidget *widget = children[childWithFocus]; |
|
457 widget->setFocus(); |
|
458 QVERIFY(widget->hasFocus()); |
|
459 QCOMPARE(parent->focusWidget(), static_cast<QGraphicsWidget*>(widget)); |
|
460 } |
|
461 } |
|
462 |
|
463 void tst_QGraphicsWidget::focusWidget2() |
|
464 { |
|
465 QGraphicsScene scene; |
|
466 QEvent windowActivate(QEvent::WindowActivate); |
|
467 qApp->sendEvent(&scene, &windowActivate); |
|
468 |
|
469 QGraphicsWidget *widget = new QGraphicsWidget; |
|
470 EventSpy focusInSpy(widget, QEvent::FocusIn); |
|
471 EventSpy focusOutSpy(widget, QEvent::FocusOut); |
|
472 |
|
473 scene.addItem(widget); |
|
474 |
|
475 QVERIFY(!widget->hasFocus()); |
|
476 widget->setFocusPolicy(Qt::StrongFocus); |
|
477 QVERIFY(!widget->hasFocus()); |
|
478 |
|
479 QGraphicsWidget *subWidget = new QGraphicsWidget(widget); |
|
480 QVERIFY(!subWidget->hasFocus()); |
|
481 |
|
482 scene.setFocus(); |
|
483 |
|
484 QVERIFY(!widget->hasFocus()); |
|
485 QVERIFY(!subWidget->hasFocus()); |
|
486 |
|
487 widget->setFocus(); |
|
488 |
|
489 QVERIFY(widget->hasFocus()); |
|
490 QCOMPARE(focusInSpy.count(), 1); |
|
491 QVERIFY(!subWidget->hasFocus()); |
|
492 |
|
493 QGraphicsWidget *otherSubWidget = new QGraphicsWidget; |
|
494 EventSpy otherFocusInSpy(otherSubWidget, QEvent::FocusIn); |
|
495 EventSpy otherFocusOutSpy(otherSubWidget, QEvent::FocusOut); |
|
496 |
|
497 otherSubWidget->setFocusPolicy(Qt::StrongFocus); |
|
498 otherSubWidget->setParentItem(widget); |
|
499 |
|
500 QVERIFY(widget->hasFocus()); |
|
501 QCOMPARE(scene.focusItem(), (QGraphicsItem *)widget); |
|
502 QVERIFY(!subWidget->hasFocus()); |
|
503 QVERIFY(!otherSubWidget->hasFocus()); |
|
504 |
|
505 widget->hide(); |
|
506 QVERIFY(!widget->hasFocus()); // lose but still has subfocus |
|
507 QCOMPARE(focusInSpy.count(), 1); |
|
508 QCOMPARE(focusOutSpy.count(), 1); |
|
509 |
|
510 widget->show(); |
|
511 QVERIFY(!widget->hasFocus()); // no regain |
|
512 QCOMPARE(focusInSpy.count(), 1); |
|
513 QCOMPARE(focusOutSpy.count(), 1); |
|
514 |
|
515 widget->hide(); |
|
516 |
|
517 // try to setup subFocus on item that can't take focus |
|
518 subWidget->setFocus(); |
|
519 QVERIFY(!subWidget->hasFocus()); |
|
520 QVERIFY(!scene.focusItem()); // but isn't the scene's focus item |
|
521 |
|
522 // try to setup subFocus on item that can take focus |
|
523 otherSubWidget->setFocus(); |
|
524 QVERIFY(!otherSubWidget->hasFocus()); |
|
525 QCOMPARE(widget->focusWidget(), otherSubWidget); |
|
526 QVERIFY(!scene.focusItem()); // but isn't the scene's focus item |
|
527 |
|
528 widget->show(); |
|
529 |
|
530 QCOMPARE(scene.focusItem(), (QGraphicsItem *)otherSubWidget); // but isn't the scene's focus item |
|
531 QCOMPARE(otherFocusInSpy.count(), 1); |
|
532 QCOMPARE(otherFocusOutSpy.count(), 0); |
|
533 |
|
534 delete otherSubWidget; |
|
535 |
|
536 QCOMPARE(otherFocusOutSpy.count(), 1); |
|
537 QVERIFY(!scene.focusItem()); |
|
538 QVERIFY(!widget->focusWidget()); |
|
539 } |
|
540 |
|
541 Q_DECLARE_METATYPE(Qt::FocusPolicy) |
|
542 void tst_QGraphicsWidget::focusPolicy_data() |
|
543 { |
|
544 QTest::addColumn<Qt::FocusPolicy>("focusPolicy1"); |
|
545 QTest::addColumn<Qt::FocusPolicy>("focusPolicy2"); |
|
546 |
|
547 for (int i = 0; i < 25; ++i) { |
|
548 QTestData &data = QTest::newRow(QString("%1").arg(i).toLatin1()); |
|
549 switch(i % 5) { |
|
550 case 0: data << Qt::TabFocus; break; |
|
551 case 1: data << Qt::ClickFocus; break; |
|
552 case 2: data << Qt::StrongFocus; break; |
|
553 case 3: data << Qt::WheelFocus; break; |
|
554 case 4: data << Qt::NoFocus; break; |
|
555 } |
|
556 switch(i / 5) { |
|
557 case 0: data << Qt::TabFocus; break; |
|
558 case 1: data << Qt::ClickFocus; break; |
|
559 case 2: data << Qt::StrongFocus; break; |
|
560 case 3: data << Qt::WheelFocus; break; |
|
561 case 4: data << Qt::NoFocus; break; |
|
562 } |
|
563 } |
|
564 } |
|
565 |
|
566 // Qt::FocusPolicy focusPolicy() const public |
|
567 void tst_QGraphicsWidget::focusPolicy() |
|
568 { |
|
569 QGraphicsScene scene; |
|
570 QEvent windowActivate(QEvent::WindowActivate); |
|
571 qApp->sendEvent(&scene, &windowActivate); |
|
572 |
|
573 SubQGraphicsWidget *widget = new SubQGraphicsWidget; |
|
574 scene.addItem(widget); |
|
575 QCOMPARE(Qt::NoFocus, widget->focusPolicy()); |
|
576 |
|
577 QFETCH(Qt::FocusPolicy, focusPolicy1); |
|
578 widget->setFocusPolicy(focusPolicy1); |
|
579 QCOMPARE(widget->focusPolicy(), focusPolicy1); |
|
580 bool isFocusable = widget->flags() & QGraphicsItem::ItemIsFocusable; |
|
581 bool wasFocusable = isFocusable; |
|
582 QVERIFY(isFocusable == (focusPolicy1 != Qt::NoFocus)); |
|
583 widget->setFocus(); |
|
584 QCOMPARE(widget->hasFocus(), isFocusable); |
|
585 |
|
586 QFETCH(Qt::FocusPolicy, focusPolicy2); |
|
587 widget->setFocusPolicy(focusPolicy2); |
|
588 QCOMPARE(widget->focusPolicy(), focusPolicy2); |
|
589 isFocusable = widget->flags() & QGraphicsItem::ItemIsFocusable; |
|
590 QVERIFY(isFocusable == (focusPolicy2 != Qt::NoFocus)); |
|
591 QCOMPARE(widget->hasFocus(), wasFocusable && isFocusable); |
|
592 } |
|
593 |
|
594 void tst_QGraphicsWidget::font_data() |
|
595 { |
|
596 QTest::addColumn<QString>("fontName"); |
|
597 QTest::newRow("Helvetica") << "Helvetica"; |
|
598 } |
|
599 |
|
600 // QFont font() const public |
|
601 void tst_QGraphicsWidget::font() |
|
602 { |
|
603 QFETCH(QString, fontName); |
|
604 SubQGraphicsWidget widget; |
|
605 QCOMPARE(widget.font(), QFont()); |
|
606 |
|
607 QFont font(fontName); |
|
608 widget.setFont(font); |
|
609 QCOMPARE(widget.font().family(), font.family()); |
|
610 } |
|
611 |
|
612 void tst_QGraphicsWidget::fontPropagation() |
|
613 { |
|
614 QGraphicsWidget *root = new QGraphicsWidget; |
|
615 QGraphicsWidget *child0 = new QGraphicsWidget(root); |
|
616 QGraphicsWidget *child1 = new QGraphicsWidget(child0); |
|
617 QGraphicsWidget *child2 = new QGraphicsWidget(child1); |
|
618 QGraphicsScene scene; |
|
619 scene.addItem(root); |
|
620 |
|
621 // Check that only the application fonts apply. |
|
622 QFont appFont = QApplication::font(); |
|
623 QCOMPARE(scene.font(), appFont); |
|
624 QCOMPARE(root->font(), appFont); |
|
625 QCOMPARE(child0->font(), appFont); |
|
626 QCOMPARE(child1->font(), appFont); |
|
627 |
|
628 // Set child0's Text, and set ToolTipBase on child1. |
|
629 QFont boldFont; |
|
630 boldFont.setBold(true); |
|
631 child0->setFont(boldFont); |
|
632 QFont italicFont; |
|
633 italicFont.setItalic(true); |
|
634 child1->setFont(italicFont); |
|
635 |
|
636 // Check that the above settings propagate correctly. |
|
637 QCOMPARE(root->font(), appFont); |
|
638 QCOMPARE(scene.font(), appFont); |
|
639 QVERIFY(child0->font().bold()); |
|
640 QVERIFY(!child0->font().italic()); |
|
641 QVERIFY(child1->font().bold()); |
|
642 QVERIFY(child1->font().italic()); |
|
643 QVERIFY(child2->font().bold()); |
|
644 QVERIFY(child2->font().italic()); |
|
645 |
|
646 QGraphicsWidget *child3 = new QGraphicsWidget(child2); |
|
647 QVERIFY(child3->font().bold()); |
|
648 QVERIFY(child3->font().italic()); |
|
649 |
|
650 QGraphicsWidget *child4 = new QGraphicsWidget; |
|
651 child4->setParentItem(child3); |
|
652 QVERIFY(child4->font().bold()); |
|
653 QVERIFY(child4->font().italic()); |
|
654 |
|
655 // Replace the app font for child2. Button should propagate but Text |
|
656 // should still be ignored. The previous ToolTipBase setting is gone. |
|
657 QFont sizeFont; |
|
658 sizeFont.setPointSize(43); |
|
659 child1->setFont(sizeFont); |
|
660 |
|
661 // Check that the above settings propagate correctly. |
|
662 QCOMPARE(root->font(), appFont); |
|
663 QCOMPARE(scene.font(), appFont); |
|
664 QVERIFY(child0->font().bold()); |
|
665 QVERIFY(!child0->font().italic()); |
|
666 QVERIFY(child1->font().bold()); |
|
667 QVERIFY(!child1->font().italic()); |
|
668 QCOMPARE(child1->font().pointSize(), 43); |
|
669 QVERIFY(child2->font().bold()); |
|
670 QVERIFY(!child2->font().italic()); |
|
671 QCOMPARE(child2->font().pointSize(), 43); |
|
672 } |
|
673 |
|
674 void tst_QGraphicsWidget::fontPropagationWidgetItemWidget() |
|
675 { |
|
676 QGraphicsWidget *widget = new QGraphicsWidget; |
|
677 QGraphicsRectItem *rect = new QGraphicsRectItem(widget); |
|
678 QGraphicsWidget *widget2 = new QGraphicsWidget(rect); |
|
679 |
|
680 QGraphicsScene scene; |
|
681 scene.addItem(widget); |
|
682 |
|
683 QFont font; |
|
684 font.setPointSize(43); |
|
685 widget->setFont(font); |
|
686 |
|
687 QCOMPARE(widget2->font().pointSize(), 43); |
|
688 QCOMPARE(widget2->font().resolve(), QFont().resolve()); |
|
689 |
|
690 widget->setFont(QFont()); |
|
691 |
|
692 QCOMPARE(widget2->font().pointSize(), qApp->font().pointSize()); |
|
693 } |
|
694 |
|
695 void tst_QGraphicsWidget::fontPropagationSceneChange() |
|
696 { |
|
697 QGraphicsWidget *widget = new QGraphicsWidget; |
|
698 QGraphicsRectItem *rect = new QGraphicsRectItem(widget); |
|
699 QGraphicsWidget *widget2 = new QGraphicsWidget(rect); |
|
700 |
|
701 QGraphicsScene scene; |
|
702 QGraphicsScene scene2; |
|
703 |
|
704 QFont font; |
|
705 font.setPointSize(47); |
|
706 scene.setFont(font); |
|
707 |
|
708 QFont font2; |
|
709 font2.setPointSize(74); |
|
710 scene2.setFont(font2); |
|
711 |
|
712 scene.addItem(widget); |
|
713 QCOMPARE(widget2->font().pointSize(), 47); |
|
714 scene2.addItem(widget); |
|
715 QCOMPARE(widget2->font().pointSize(), 74); |
|
716 } |
|
717 |
|
718 void tst_QGraphicsWidget::geometry_data() |
|
719 { |
|
720 QTest::addColumn<QPointF>("pos"); |
|
721 QTest::addColumn<QSizeF>("size"); |
|
722 QTest::newRow("null, null") << QPointF() << QSizeF(0, 0); |
|
723 QTest::newRow("null, normal") << QPointF() << QSizeF(10, 10); |
|
724 QTest::newRow("neg, normal") << QPointF(-5, -5) << QSizeF(10, 10); |
|
725 } |
|
726 |
|
727 // QRectF geometry() const public |
|
728 void tst_QGraphicsWidget::geometry() |
|
729 { |
|
730 SubQGraphicsWidget widget; |
|
731 QCOMPARE(widget.geometry(), QRectF(widget.pos(), widget.size())); |
|
732 |
|
733 QFETCH(QPointF, pos); |
|
734 QFETCH(QSizeF, size); |
|
735 widget.setPos(pos); |
|
736 widget.resize(size); |
|
737 QCOMPARE(widget.geometry(), QRectF(pos, size)); |
|
738 } |
|
739 |
|
740 void tst_QGraphicsWidget::getContentsMargins_data() |
|
741 { |
|
742 QTest::addColumn<qreal>("left"); |
|
743 QTest::addColumn<qreal>("top"); |
|
744 QTest::addColumn<qreal>("right"); |
|
745 QTest::addColumn<qreal>("bottom"); |
|
746 QTest::newRow("null") << (qreal)0 << (qreal)0 << (qreal)0 << (qreal)0; |
|
747 QTest::newRow("something") << (qreal)10 << (qreal)5 << (qreal)3 << (qreal)7; |
|
748 QTest::newRow("real") << (qreal)1.7 << (qreal)5.9 << (qreal)3.2 << (qreal)9.7; |
|
749 } |
|
750 |
|
751 // void getContentsMargins(qreal* left, qreal* top, qreal* right, qreal* bottom) const public |
|
752 void tst_QGraphicsWidget::getContentsMargins() |
|
753 { |
|
754 qreal gleft; |
|
755 qreal gtop; |
|
756 qreal gright; |
|
757 qreal gbottom; |
|
758 |
|
759 SubQGraphicsWidget widget; |
|
760 widget.getContentsMargins(&gleft, >op, &gright, &gbottom); |
|
761 QCOMPARE(gleft, (qreal)0); |
|
762 QCOMPARE(gtop, (qreal)0); |
|
763 QCOMPARE(gright, (qreal)0); |
|
764 QCOMPARE(gbottom, (qreal)0); |
|
765 |
|
766 QFETCH(qreal, left); |
|
767 QFETCH(qreal, top); |
|
768 QFETCH(qreal, right); |
|
769 QFETCH(qreal, bottom); |
|
770 int oldEventCounts = widget.eventCount; |
|
771 widget.setContentsMargins(left, top, right, bottom); |
|
772 QVERIFY(left == 0 || oldEventCounts != widget.eventCount); |
|
773 widget.getContentsMargins(&gleft, >op, &gright, &gbottom); |
|
774 QCOMPARE(gleft, left); |
|
775 QCOMPARE(gtop, top); |
|
776 QCOMPARE(gright, right); |
|
777 QCOMPARE(gbottom, bottom); |
|
778 } |
|
779 |
|
780 Q_DECLARE_METATYPE(Qt::LayoutDirection) |
|
781 void tst_QGraphicsWidget::initStyleOption_data() |
|
782 { |
|
783 QTest::addColumn<bool>("enabled"); |
|
784 QTest::addColumn<bool>("focus"); |
|
785 QTest::addColumn<bool>("underMouse"); |
|
786 QTest::addColumn<Qt::LayoutDirection>("layoutDirection"); |
|
787 QTest::addColumn<QSizeF>("size"); |
|
788 QTest::addColumn<QPalette>("palette"); |
|
789 QTest::addColumn<QString>("fontName"); |
|
790 QTest::newRow("none") << false << false << false << Qt::LeftToRight << QSizeF(0, 0) << QPalette() << QString(); |
|
791 QTest::newRow("all") << true << true << true << Qt::RightToLeft << QSizeF(300, 300) << QPalette(Qt::magenta) << "Helvetica"; |
|
792 QTest::newRow("rand") << true << false << false << Qt::RightToLeft << QSizeF(1, 0) << QPalette(Qt::darkCyan) << "Times"; |
|
793 } |
|
794 |
|
795 // void initStyleOption(QStyleOption* option) const public |
|
796 void tst_QGraphicsWidget::initStyleOption() |
|
797 { |
|
798 QGraphicsScene scene; |
|
799 QGraphicsView view(&scene); |
|
800 view.show(); |
|
801 #ifdef Q_WS_X11 |
|
802 qt_x11_wait_for_window_manager(&view); |
|
803 #endif |
|
804 QApplication::setActiveWindow(&view); |
|
805 QTest::qWait(25); |
|
806 QTRY_COMPARE(QApplication::activeWindow(), &view); |
|
807 |
|
808 view.setAlignment(Qt::AlignTop | Qt::AlignLeft); |
|
809 SubQGraphicsWidget *widget = new SubQGraphicsWidget; |
|
810 widget->setAcceptsHoverEvents(true); |
|
811 QStyleOption option; |
|
812 scene.addItem(widget); |
|
813 |
|
814 QFETCH(QSizeF, size); |
|
815 widget->resize(size); |
|
816 |
|
817 QFETCH(bool, enabled); |
|
818 widget->setEnabled(enabled); |
|
819 QFETCH(bool, focus); |
|
820 if (focus) { |
|
821 widget->setFlag(QGraphicsItem::ItemIsFocusable, true); |
|
822 widget->setFocus(); |
|
823 QVERIFY(widget->hasFocus()); |
|
824 } |
|
825 QFETCH(bool, underMouse); |
|
826 if (underMouse) { |
|
827 view.resize(300, 300); |
|
828 view.show(); |
|
829 QTest::qWaitForWindowShown(&view); |
|
830 QTest::qWait(20); |
|
831 sendMouseMove(view.viewport(), view.mapFromScene(widget->mapToScene(widget->boundingRect().center()))); |
|
832 } |
|
833 |
|
834 QFETCH(QPalette, palette); |
|
835 widget->setPalette(palette); |
|
836 |
|
837 QFETCH(QString, fontName); |
|
838 widget->setFont(QFont(fontName)); |
|
839 |
|
840 // The test |
|
841 widget->initStyleOption(&option); |
|
842 |
|
843 bool isEnabled = option.state & QStyle::State_Enabled; |
|
844 QCOMPARE(isEnabled, enabled); |
|
845 bool hasFocus = option.state & QStyle::State_HasFocus; |
|
846 QCOMPARE(hasFocus, focus); |
|
847 bool isUnderMouse = option.state & QStyle::State_MouseOver; |
|
848 #ifndef Q_OS_WINCE |
|
849 QCOMPARE(isUnderMouse, underMouse); |
|
850 #endif |
|
851 // if (layoutDirection != Qt::LeftToRight) |
|
852 //QEXPECT_FAIL("", "QApplicaiton::layoutDirection doesn't propagate to QGraphicsWidget", Continue); |
|
853 //QCOMPARE(option.direction, layoutDirection); |
|
854 QCOMPARE(option.rect, QRectF(QPointF(), size).toRect()); |
|
855 QCOMPARE(option.palette, palette.resolve(QApplication::palette())); |
|
856 QCOMPARE(option.fontMetrics, QFontMetrics(widget->font())); |
|
857 } |
|
858 |
|
859 void tst_QGraphicsWidget::layout_data() |
|
860 { |
|
861 QTest::addColumn<int>("childCount"); |
|
862 QTest::newRow("empty") << 0; |
|
863 QTest::newRow("10") << 10; |
|
864 } |
|
865 |
|
866 // QGraphicsLayout* layout() const public |
|
867 void tst_QGraphicsWidget::layout() |
|
868 { |
|
869 SubQGraphicsWidget widget; |
|
870 widget.setContentsMargins(10, 5, 50, 100); |
|
871 QCOMPARE(widget.layout(), (QGraphicsLayout *)0); |
|
872 QFETCH(int, childCount); |
|
873 |
|
874 QGraphicsLinearLayout *layout = new QGraphicsLinearLayout; |
|
875 QList<SubQGraphicsWidget*> children; |
|
876 for (int i = 0; i < childCount; ++i) { |
|
877 SubQGraphicsWidget *item = new SubQGraphicsWidget; |
|
878 layout->addItem(item); |
|
879 children.append(item); |
|
880 } |
|
881 widget.setLayout(layout); |
|
882 |
|
883 QTest::qWait(25); |
|
884 |
|
885 QCOMPARE(widget.layout(), static_cast<QGraphicsLayout*>(layout)); |
|
886 for (int i = 0; i < children.count(); ++i) { |
|
887 SubQGraphicsWidget *item = children[i]; |
|
888 QCOMPARE(item->parentWidget(), (QGraphicsWidget *)&widget); |
|
889 QVERIFY(item->geometry() != QRectF(0, 0, -1, -1)); |
|
890 } |
|
891 |
|
892 // don't crash |
|
893 widget.setLayout(0); |
|
894 } |
|
895 |
|
896 void tst_QGraphicsWidget::layoutDirection_data() |
|
897 { |
|
898 QTest::addColumn<Qt::LayoutDirection>("layoutDirection"); |
|
899 QTest::newRow("rtl") << Qt::RightToLeft; |
|
900 QTest::newRow("ltr") << Qt::LeftToRight; |
|
901 } |
|
902 |
|
903 // Qt::LayoutDirection layoutDirection() const public |
|
904 void tst_QGraphicsWidget::layoutDirection() |
|
905 { |
|
906 QFETCH(Qt::LayoutDirection, layoutDirection); |
|
907 QGraphicsScene scene; |
|
908 QGraphicsView *view = new QGraphicsView(&scene); |
|
909 SubQGraphicsWidget widget; |
|
910 scene.addItem(&widget); |
|
911 QCOMPARE(widget.layoutDirection(), Qt::LeftToRight); |
|
912 QCOMPARE(widget.testAttribute(Qt::WA_SetLayoutDirection), false); |
|
913 |
|
914 QList<SubQGraphicsWidget*> children; |
|
915 for (int i = 0; i < 10; ++i) { |
|
916 SubQGraphicsWidget *item = new SubQGraphicsWidget(&widget); |
|
917 children.append(item); |
|
918 QCOMPARE(item->testAttribute(Qt::WA_SetLayoutDirection), false); |
|
919 } |
|
920 widget.setLayoutDirection(layoutDirection); |
|
921 QCOMPARE(widget.testAttribute(Qt::WA_SetLayoutDirection), true); |
|
922 view->show(); |
|
923 QTest::qWaitForWindowShown(view); |
|
924 for (int i = 0; i < children.count(); ++i) { |
|
925 QCOMPARE(children[i]->layoutDirection(), layoutDirection); |
|
926 QCOMPARE(children[i]->testAttribute(Qt::WA_SetLayoutDirection), false); |
|
927 view->repaint(); |
|
928 QApplication::processEvents(); |
|
929 QTRY_COMPARE(children[i]->m_painterLayoutDirection, layoutDirection); |
|
930 } |
|
931 delete view; |
|
932 } |
|
933 |
|
934 void tst_QGraphicsWidget::paint_data() |
|
935 { |
|
936 // currently QGraphicsWidget doesn't paint or do anything ... |
|
937 } |
|
938 |
|
939 // void paint(QPainter* painter, QStyleOptionGraphicsItem const* option, QWidget* widget) public |
|
940 void tst_QGraphicsWidget::paint() |
|
941 { |
|
942 SubQGraphicsWidget widget; |
|
943 QPainter painter; |
|
944 QStyleOptionGraphicsItem option; |
|
945 widget.paint(&painter, &option, 0); // check that widget = 0 works. |
|
946 } |
|
947 |
|
948 void tst_QGraphicsWidget::palettePropagation() |
|
949 { |
|
950 QGraphicsWidget *root = new QGraphicsWidget; |
|
951 QGraphicsWidget *child0 = new QGraphicsWidget(root); |
|
952 QGraphicsWidget *child1 = new QGraphicsWidget(child0); |
|
953 QGraphicsWidget *child2 = new QGraphicsWidget(child1); |
|
954 QGraphicsScene scene; |
|
955 scene.addItem(root); |
|
956 |
|
957 // These colors are unlikely to be imposed on the default palette of |
|
958 // QWidget ;-). |
|
959 QColor sysPalText(21, 22, 23); |
|
960 QColor sysPalToolTipBase(12, 13, 14); |
|
961 QColor overridePalText(42, 43, 44); |
|
962 QColor overridePalToolTipBase(45, 46, 47); |
|
963 QColor sysPalButton(99, 98, 97); |
|
964 |
|
965 // Check that only the application fonts apply. |
|
966 QPalette appPal = QApplication::palette(); |
|
967 QCOMPARE(scene.palette(), appPal); |
|
968 QCOMPARE(root->palette(), appPal); |
|
969 QCOMPARE(child0->palette(), appPal); |
|
970 QCOMPARE(child1->palette(), appPal); |
|
971 |
|
972 // Set child0's Text, and set ToolTipBase on child1. |
|
973 QPalette textPalette; |
|
974 textPalette.setColor(QPalette::Text, overridePalText); |
|
975 child0->setPalette(textPalette); |
|
976 QPalette toolTipPalette; |
|
977 toolTipPalette.setColor(QPalette::ToolTipBase, overridePalToolTipBase); |
|
978 child1->setPalette(toolTipPalette); |
|
979 |
|
980 // Check that the above settings propagate correctly. |
|
981 QCOMPARE(root->palette(), appPal); |
|
982 QCOMPARE(scene.palette(), appPal); |
|
983 QCOMPARE(child0->palette().color(QPalette::Text), overridePalText); |
|
984 QCOMPARE(child0->palette().color(QPalette::ToolTipBase), appPal.color(QPalette::ToolTipBase)); |
|
985 QCOMPARE(child1->palette().color(QPalette::Text), overridePalText); |
|
986 QCOMPARE(child1->palette().color(QPalette::ToolTipBase), overridePalToolTipBase); |
|
987 QCOMPARE(child2->palette().color(QPalette::Text), overridePalText); |
|
988 QCOMPARE(child2->palette().color(QPalette::ToolTipBase), overridePalToolTipBase); |
|
989 |
|
990 QGraphicsWidget *child3 = new QGraphicsWidget(child2); |
|
991 QCOMPARE(child3->palette().color(QPalette::Text), overridePalText); |
|
992 QCOMPARE(child3->palette().color(QPalette::ToolTipBase), overridePalToolTipBase); |
|
993 |
|
994 QGraphicsWidget *child4 = new QGraphicsWidget; |
|
995 child4->setParentItem(child3); |
|
996 QCOMPARE(child4->palette().color(QPalette::Text), overridePalText); |
|
997 QCOMPARE(child4->palette().color(QPalette::ToolTipBase), overridePalToolTipBase); |
|
998 |
|
999 // Replace the app palette for child2. Button should propagate but Text |
|
1000 // should still be ignored. The previous ToolTipBase setting is gone. |
|
1001 QPalette buttonPalette; |
|
1002 buttonPalette.setColor(QPalette::Button, sysPalButton); |
|
1003 child1->setPalette(buttonPalette); |
|
1004 |
|
1005 QCOMPARE(root->palette(), appPal); |
|
1006 QCOMPARE(scene.palette(), appPal); |
|
1007 QCOMPARE(child0->palette().color(QPalette::Text), overridePalText); |
|
1008 QCOMPARE(child0->palette().color(QPalette::ToolTipBase), appPal.color(QPalette::ToolTipBase)); |
|
1009 QCOMPARE(child1->palette().color(QPalette::Text), overridePalText); |
|
1010 QCOMPARE(child1->palette().color(QPalette::ToolTipBase), appPal.color(QPalette::ToolTipBase)); |
|
1011 QCOMPARE(child1->palette().color(QPalette::Button), sysPalButton); |
|
1012 QCOMPARE(child2->palette().color(QPalette::Text), overridePalText); |
|
1013 QCOMPARE(child2->palette().color(QPalette::ToolTipBase), appPal.color(QPalette::ToolTipBase)); |
|
1014 QCOMPARE(child2->palette().color(QPalette::Button), sysPalButton); |
|
1015 } |
|
1016 |
|
1017 void tst_QGraphicsWidget::parentWidget_data() |
|
1018 { |
|
1019 QTest::addColumn<int>("childrenCount"); |
|
1020 QTest::newRow("0") << 0; |
|
1021 QTest::newRow("1") << 1; |
|
1022 QTest::newRow("10") << 10; |
|
1023 } |
|
1024 |
|
1025 // QGraphicsWidget* parentWidget() const public |
|
1026 void tst_QGraphicsWidget::parentWidget() |
|
1027 { |
|
1028 QFETCH(int, childrenCount); |
|
1029 SubQGraphicsWidget standAlongWidget; |
|
1030 QGraphicsLineItem standAlongItem; |
|
1031 |
|
1032 SubQGraphicsWidget widgetChild(&standAlongWidget); |
|
1033 SubQGraphicsWidget itemChild(&standAlongItem); |
|
1034 |
|
1035 QCOMPARE(standAlongWidget.parentWidget(), (QGraphicsWidget*)0); |
|
1036 QCOMPARE(widgetChild.parentWidget(), static_cast<QGraphicsWidget*>(&standAlongWidget)); |
|
1037 QCOMPARE(itemChild.parentWidget(), (QGraphicsWidget*)0); |
|
1038 |
|
1039 for (int i = 0; i < childrenCount; ++i) { |
|
1040 SubQGraphicsWidget *item = new SubQGraphicsWidget(&standAlongWidget); |
|
1041 QCOMPARE(item->parentWidget(), static_cast<QGraphicsWidget*>(&standAlongWidget)); |
|
1042 } |
|
1043 } |
|
1044 |
|
1045 void tst_QGraphicsWidget::resize_data() |
|
1046 { |
|
1047 QTest::addColumn<QSizeF>("size"); |
|
1048 QTest::newRow("null") << QSizeF(); |
|
1049 QTest::newRow("10x10") << QSizeF(10, 10); |
|
1050 QTest::newRow("10x-1") << QSizeF(10, -1); |
|
1051 } |
|
1052 |
|
1053 // void resize(qreal w, qreal h) public |
|
1054 void tst_QGraphicsWidget::resize() |
|
1055 { |
|
1056 QFETCH(QSizeF, size); |
|
1057 SubQGraphicsWidget widget; |
|
1058 |
|
1059 int oldEventCounts = widget.eventCount; |
|
1060 QSizeF oldSize = widget.size(); |
|
1061 widget.resize(size); |
|
1062 |
|
1063 QSizeF boundedSize = size.expandedTo(widget.minimumSize()).boundedTo(widget.maximumSize()); |
|
1064 QCOMPARE(widget.eventCount, oldEventCounts + ((oldSize == boundedSize) ? 0 : 1)); |
|
1065 QCOMPARE(widget.size(), boundedSize); |
|
1066 } |
|
1067 |
|
1068 Q_DECLARE_METATYPE(Qt::WidgetAttribute) |
|
1069 void tst_QGraphicsWidget::setAttribute_data() |
|
1070 { |
|
1071 QTest::addColumn<Qt::WidgetAttribute>("attribute"); |
|
1072 QTest::addColumn<bool>("supported"); |
|
1073 QTest::newRow("WA_SetLayoutDirection") << Qt::WA_SetLayoutDirection << true; |
|
1074 QTest::newRow("WA_RightToLeft") << Qt::WA_RightToLeft << true; |
|
1075 QTest::newRow("WA_SetStyle") << Qt::WA_SetStyle << true; |
|
1076 QTest::newRow("WA_Resized") << Qt::WA_Resized << true; |
|
1077 QTest::newRow("unsupported") << Qt::WA_PaintOutsidePaintEvent << false; |
|
1078 } |
|
1079 |
|
1080 // void setAttribute(Qt::WidgetAttribute attribute, bool on = true) public |
|
1081 void tst_QGraphicsWidget::setAttribute() |
|
1082 { |
|
1083 QFETCH(Qt::WidgetAttribute, attribute); |
|
1084 QFETCH(bool, supported); |
|
1085 SubQGraphicsWidget widget; |
|
1086 if (attribute == Qt::WA_PaintOutsidePaintEvent) |
|
1087 QTest::ignoreMessage(QtWarningMsg, "QGraphicsWidget::setAttribute: unsupported attribute 13"); |
|
1088 widget.setAttribute(attribute); |
|
1089 QCOMPARE(widget.testAttribute(attribute), supported); |
|
1090 } |
|
1091 |
|
1092 void tst_QGraphicsWidget::setStyle_data() |
|
1093 { |
|
1094 QTest::addColumn<QString>("style"); |
|
1095 QTest::newRow("null") << ""; |
|
1096 QTest::newRow("cleanlooks") << "QCleanlooksStyle"; |
|
1097 } |
|
1098 |
|
1099 // void setStyle(QStyle* style) public |
|
1100 void tst_QGraphicsWidget::setStyle() |
|
1101 { |
|
1102 SubQGraphicsWidget widget; |
|
1103 QCleanlooksStyle cleanlooksStyle; |
|
1104 |
|
1105 int oldEventCounts = widget.eventCount; |
|
1106 |
|
1107 QFETCH(QString, style); |
|
1108 if (style == "QCleanlooksStyle") { |
|
1109 widget.setStyle(&cleanlooksStyle); |
|
1110 QCOMPARE(widget.style(), static_cast<QStyle*>(&cleanlooksStyle)); |
|
1111 } else { |
|
1112 widget.setStyle(0); |
|
1113 QVERIFY(widget.style() != (QStyle *)0); |
|
1114 } |
|
1115 QCOMPARE(widget.eventCount, oldEventCounts + 1); |
|
1116 QCOMPARE(widget.testAttribute(Qt::WA_SetStyle), !style.isEmpty()); |
|
1117 |
|
1118 // cleanup |
|
1119 widget.setStyle(0); |
|
1120 } |
|
1121 |
|
1122 void tst_QGraphicsWidget::setTabOrder_data() |
|
1123 { |
|
1124 QTest::addColumn<int>("childrenCount"); |
|
1125 QTest::newRow("0") << 0; |
|
1126 QTest::newRow("1") << 1; |
|
1127 QTest::newRow("10") << 10; |
|
1128 } |
|
1129 |
|
1130 // void setTabOrder(QGraphicsWidget* first, QGraphicsWidget* second) public |
|
1131 void tst_QGraphicsWidget::setTabOrder() |
|
1132 { |
|
1133 QFETCH(int, childrenCount); |
|
1134 QGraphicsScene scene; |
|
1135 QGraphicsView view(&scene); |
|
1136 view.show(); |
|
1137 #ifdef Q_WS_X11 |
|
1138 qt_x11_wait_for_window_manager(&view); |
|
1139 #endif |
|
1140 QApplication::setActiveWindow(&view); |
|
1141 QTest::qWait(25); |
|
1142 QTRY_COMPARE(QApplication::activeWindow(), &view); |
|
1143 |
|
1144 QGraphicsWidget *lastItem = 0; |
|
1145 QTest::ignoreMessage(QtWarningMsg, "QGraphicsWidget::setTabOrder(0, 0) is undefined"); |
|
1146 QGraphicsWidget::setTabOrder(0, 0); |
|
1147 |
|
1148 QList<SubQGraphicsWidget*> children; |
|
1149 for (int i = 0; i < childrenCount; ++i) { |
|
1150 SubQGraphicsWidget *item = new SubQGraphicsWidget(); |
|
1151 item->setFocusPolicy(Qt::TabFocus); |
|
1152 children.append(item); |
|
1153 scene.addItem(item); |
|
1154 if (lastItem) |
|
1155 QGraphicsWidget::setTabOrder(lastItem, item); |
|
1156 lastItem = item; |
|
1157 } |
|
1158 |
|
1159 if (!children.isEmpty()) { |
|
1160 QGraphicsWidget *first = children.first(); |
|
1161 view.viewport()->setFocus(); |
|
1162 QApplication::processEvents(); |
|
1163 QTRY_VERIFY(view.viewport()->hasFocus()); |
|
1164 first->setFocus(); |
|
1165 QVERIFY(first->hasFocus()); |
|
1166 QVERIFY(scene.hasFocus()); |
|
1167 QVERIFY(view.viewport()->hasFocus()); |
|
1168 |
|
1169 int currentItem = 0; |
|
1170 while (currentItem < children.count() - 1) { |
|
1171 QTest::keyPress(view.viewport(), Qt::Key_Tab); |
|
1172 ++currentItem; |
|
1173 QVERIFY(children[currentItem % children.size()]->hasFocus()); |
|
1174 } |
|
1175 } |
|
1176 } |
|
1177 |
|
1178 static bool compareFocusChain(QGraphicsView *view, const QList<QGraphicsItem*> &order) |
|
1179 { |
|
1180 QGraphicsScene *scene = view->scene(); |
|
1181 QStringList actual; |
|
1182 QGraphicsItem *oldFocusItem = scene->focusItem(); |
|
1183 for (int i = 0; i < order.count(); ++i) { |
|
1184 QGraphicsItem *focusItem = scene->focusItem(); |
|
1185 actual << focusItem->data(0).toString(); |
|
1186 //qDebug() << "i:" << i << "expected:" << QString::number(uint(order.at(i)), 16) << QString::number(uint(focusItem), 16); |
|
1187 if (focusItem != order.at(i)) { |
|
1188 qDebug() << "actual:" << actual; |
|
1189 scene->setFocusItem(oldFocusItem); |
|
1190 return false; |
|
1191 } |
|
1192 if (i < order.count() - 1) |
|
1193 QTest::keyPress(view, Qt::Key_Tab); |
|
1194 } |
|
1195 scene->setFocusItem(oldFocusItem); |
|
1196 return true; |
|
1197 } |
|
1198 |
|
1199 void tst_QGraphicsWidget::setTabOrderAndReparent() |
|
1200 { |
|
1201 QGraphicsScene scene; |
|
1202 QGraphicsView view(&scene); |
|
1203 view.show(); |
|
1204 QApplication::setActiveWindow(&view); |
|
1205 QTest::qWaitForWindowShown(&view); |
|
1206 QTRY_COMPARE(QApplication::activeWindow(), &view); |
|
1207 |
|
1208 int i; |
|
1209 QGraphicsWidget *w1, *w2, *w3, *w4; |
|
1210 for (i = 1; i < 4; ++i) { |
|
1211 QGraphicsWidget *wid = new QGraphicsWidget; |
|
1212 wid->setFocusPolicy(Qt::StrongFocus); |
|
1213 wid->setData(0, QString::fromAscii("w%1").arg(i)); |
|
1214 scene.addItem(wid); |
|
1215 if (i == 1) |
|
1216 w1 = wid; |
|
1217 else if (i == 2) |
|
1218 w2 = wid; |
|
1219 else if (i == 3) |
|
1220 w3 = wid; |
|
1221 } |
|
1222 |
|
1223 w1->setFocus(); |
|
1224 QTRY_VERIFY(w1->hasFocus()); |
|
1225 QVERIFY(compareFocusChain(&view, QList<QGraphicsItem*>() << w1 << w2 << w3)); |
|
1226 |
|
1227 QGraphicsWidget *p = new QGraphicsWidget; |
|
1228 p->setData(0, QLatin1String("parent")); |
|
1229 p->setFocusPolicy(Qt::StrongFocus); |
|
1230 |
|
1231 w1->setFocus(); |
|
1232 QVERIFY(compareFocusChain(&view, QList<QGraphicsItem*>() << w1 << w2 << w3)); |
|
1233 |
|
1234 w1->setParentItem(p); |
|
1235 w2->setFocus(); |
|
1236 QVERIFY(compareFocusChain(&view, QList<QGraphicsItem*>() << w2 << w3)); |
|
1237 |
|
1238 w2->setParentItem(p); |
|
1239 w3->setFocus(); |
|
1240 QVERIFY(compareFocusChain(&view, QList<QGraphicsItem*>() << w3)); |
|
1241 w3->setParentItem(p); |
|
1242 QCOMPARE(scene.focusItem(), static_cast<QGraphicsItem*>(0)); |
|
1243 |
|
1244 scene.addItem(p); |
|
1245 p->setFocus(); |
|
1246 |
|
1247 QVERIFY(compareFocusChain(&view, QList<QGraphicsItem*>() << p << w1 << w2 << w3)); |
|
1248 delete p; |
|
1249 |
|
1250 for (i = 1; i < 5; ++i) { |
|
1251 QGraphicsWidget *wid = new QGraphicsWidget; |
|
1252 wid->setFocusPolicy(Qt::StrongFocus); |
|
1253 wid->setData(0, QString::fromAscii("w%1").arg(i)); |
|
1254 scene.addItem(wid); |
|
1255 if (i == 1) |
|
1256 w1 = wid; |
|
1257 else if (i == 2) |
|
1258 w2 = wid; |
|
1259 else if (i == 3) |
|
1260 w3 = wid; |
|
1261 else if (i == 4) |
|
1262 w4 = wid; |
|
1263 } |
|
1264 w4->setParentItem(w1); |
|
1265 QGraphicsWidget::setTabOrder(w1, w4); |
|
1266 w1->setFocus(); |
|
1267 QVERIFY(compareFocusChain(&view, QList<QGraphicsItem*>() << w1 << w4 << w2 << w3)); |
|
1268 |
|
1269 p = new QGraphicsWidget; |
|
1270 p->setData(0, QLatin1String("parent")); |
|
1271 p->setFocusPolicy(Qt::StrongFocus); |
|
1272 |
|
1273 w1->setParentItem(p); |
|
1274 w2->setFocus(); |
|
1275 QVERIFY(compareFocusChain(&view, QList<QGraphicsItem*>() << w2 << w3)); |
|
1276 |
|
1277 scene.addItem(p); |
|
1278 w2->setFocus(); |
|
1279 QVERIFY(compareFocusChain(&view, QList<QGraphicsItem*>() << w2 << w3 << p << w1 << w4)); |
|
1280 } |
|
1281 |
|
1282 void tst_QGraphicsWidget::topLevelWidget_data() |
|
1283 { |
|
1284 QTest::addColumn<QString>("str"); |
|
1285 QTest::newRow("test one") << "foo"; |
|
1286 } |
|
1287 |
|
1288 // QGraphicsWidget* topLevelWidget() const public |
|
1289 void tst_QGraphicsWidget::topLevelWidget() |
|
1290 { |
|
1291 QFETCH(QString, str); |
|
1292 SubQGraphicsWidget widget; |
|
1293 QCOMPARE(widget.topLevelWidget(), (QGraphicsWidget *)&widget); |
|
1294 } |
|
1295 |
|
1296 void tst_QGraphicsWidget::unsetLayoutDirection_data() |
|
1297 { |
|
1298 QTest::addColumn<Qt::LayoutDirection>("layoutDirection"); |
|
1299 QTest::newRow("rtl") << Qt::RightToLeft; |
|
1300 QTest::newRow("ltr") << Qt::LeftToRight; |
|
1301 } |
|
1302 |
|
1303 // void unsetLayoutDirection() public |
|
1304 void tst_QGraphicsWidget::unsetLayoutDirection() |
|
1305 { |
|
1306 QApplication::setLayoutDirection(Qt::LeftToRight); |
|
1307 QFETCH(Qt::LayoutDirection, layoutDirection); |
|
1308 SubQGraphicsWidget widget; |
|
1309 QCOMPARE(Qt::LeftToRight, widget.layoutDirection()); |
|
1310 |
|
1311 QList<SubQGraphicsWidget*> children; |
|
1312 for (int i = 0; i < 10; ++i) { |
|
1313 SubQGraphicsWidget *item = new SubQGraphicsWidget(&widget); |
|
1314 children.append(item); |
|
1315 } |
|
1316 widget.setLayoutDirection(layoutDirection); |
|
1317 widget.unsetLayoutDirection(); |
|
1318 QCOMPARE(widget.testAttribute(Qt::WA_SetLayoutDirection), false); |
|
1319 for (int i = 0; i < children.count(); ++i) { |
|
1320 QCOMPARE(children[i]->layoutDirection(), Qt::LeftToRight); |
|
1321 } |
|
1322 } |
|
1323 |
|
1324 void tst_QGraphicsWidget::focusNextPrevChild_data() |
|
1325 { |
|
1326 QTest::addColumn<QString>("str"); |
|
1327 QTest::newRow("test one") << "foo"; |
|
1328 } |
|
1329 |
|
1330 // bool focusNextPrevChild(bool next) protected |
|
1331 void tst_QGraphicsWidget::focusNextPrevChild() |
|
1332 { |
|
1333 QFETCH(QString, str); |
|
1334 SubQGraphicsWidget widget; |
|
1335 // ### write test after just calling it stops crashing :) |
|
1336 widget.call_focusNextPrevChild(true); |
|
1337 } |
|
1338 |
|
1339 void tst_QGraphicsWidget::verifyFocusChain() |
|
1340 { |
|
1341 QGraphicsScene scene; |
|
1342 QGraphicsView view(&scene); |
|
1343 view.show(); |
|
1344 QApplication::setActiveWindow(&view); |
|
1345 QTest::qWaitForWindowShown(&view); |
|
1346 QTRY_COMPARE(QApplication::activeWindow(), &view); |
|
1347 |
|
1348 { |
|
1349 // parent/child focus |
|
1350 SubQGraphicsWidget *w = new SubQGraphicsWidget(0, Qt::Window); |
|
1351 w->setFocusPolicy(Qt::StrongFocus); |
|
1352 SubQGraphicsWidget *w1_1 = new SubQGraphicsWidget(w); |
|
1353 w1_1->setFocusPolicy(Qt::StrongFocus); |
|
1354 scene.addItem(w); |
|
1355 w->setFocus(); |
|
1356 QVERIFY(w->hasFocus()); |
|
1357 w->call_focusNextPrevChild(true); |
|
1358 QVERIFY(w1_1->hasFocus()); |
|
1359 delete w; |
|
1360 } |
|
1361 |
|
1362 { |
|
1363 // delete item in focus chain and verify chain |
|
1364 SubQGraphicsWidget *w = new SubQGraphicsWidget(0, Qt::Window); |
|
1365 SubQGraphicsWidget *w1_1 = new SubQGraphicsWidget(w); |
|
1366 SubQGraphicsWidget *w1_2 = new SubQGraphicsWidget(w); |
|
1367 SubQGraphicsWidget *w1_3 = new SubQGraphicsWidget(w); |
|
1368 w1_1->setFocusPolicy(Qt::StrongFocus); |
|
1369 w1_2->setFocusPolicy(Qt::StrongFocus); |
|
1370 w1_3->setFocusPolicy(Qt::StrongFocus); |
|
1371 scene.addItem(w); |
|
1372 w1_1->setFocus(); |
|
1373 QVERIFY(w1_1->hasFocus()); |
|
1374 QCOMPARE(w->call_focusNextPrevChild(true), true); |
|
1375 QVERIFY(w1_2->hasFocus()); |
|
1376 QCOMPARE(w->call_focusNextPrevChild(true), true); |
|
1377 QVERIFY(w1_3->hasFocus()); |
|
1378 w1_1->setFocus(); |
|
1379 delete w1_2; |
|
1380 w->call_focusNextPrevChild(true); |
|
1381 QVERIFY(w1_3->hasFocus()); |
|
1382 delete w; |
|
1383 } |
|
1384 { |
|
1385 // parent/child focus |
|
1386 SubQGraphicsWidget *w = new SubQGraphicsWidget(0, Qt::Window); |
|
1387 w->setFocusPolicy(Qt::StrongFocus); |
|
1388 SubQGraphicsWidget *w1_1 = new SubQGraphicsWidget(w); |
|
1389 w1_1->setFocusPolicy(Qt::StrongFocus); |
|
1390 scene.addItem(w); |
|
1391 w->setFocus(); |
|
1392 QVERIFY(w->hasFocus()); |
|
1393 w->call_focusNextPrevChild(true); |
|
1394 QVERIFY(w1_1->hasFocus()); |
|
1395 delete w; |
|
1396 } |
|
1397 { |
|
1398 // remove the tabFocusFirst widget from the scene. |
|
1399 QWidget *window = new QWidget; |
|
1400 QVBoxLayout *layout = new QVBoxLayout; |
|
1401 window->setLayout(layout); |
|
1402 QLineEdit *lineEdit = new QLineEdit; |
|
1403 layout->addWidget(lineEdit); |
|
1404 QGraphicsView *view = new QGraphicsView(&scene); |
|
1405 scene.setSceneRect(-20, -20, 200, 50); |
|
1406 layout->addWidget(view); |
|
1407 view->setMinimumSize(150, 50); |
|
1408 SubQGraphicsWidget *w1_1 = new SubQGraphicsWidget; |
|
1409 w1_1->setData(0, "w1_1"); |
|
1410 w1_1->setGeometry(0,0,25, 25); |
|
1411 w1_1->setFocusPolicy(Qt::StrongFocus); |
|
1412 scene.addItem(w1_1); |
|
1413 SubQGraphicsWidget *w1_2 = new SubQGraphicsWidget; |
|
1414 w1_2->setData(0, "w1_2"); |
|
1415 w1_2->setGeometry(25,0,25, 25); |
|
1416 w1_2->setFocusPolicy(Qt::StrongFocus); |
|
1417 scene.addItem(w1_2); |
|
1418 window->show(); |
|
1419 QApplication::setActiveWindow(window); |
|
1420 QTest::qWaitForWindowShown(window); |
|
1421 |
|
1422 lineEdit->setFocus(); |
|
1423 QTest::qWait(25); |
|
1424 QTRY_VERIFY(lineEdit->hasFocus()); |
|
1425 QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); |
|
1426 QTest::qWait(25); |
|
1427 QTRY_VERIFY(w1_1->hasFocus()); |
|
1428 QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); |
|
1429 QTest::qWait(25); |
|
1430 QTRY_VERIFY(w1_2->hasFocus()); |
|
1431 |
|
1432 // remove the tabFocusFirst and insert new item |
|
1433 delete w1_1; // calls _q_removeItemLater |
|
1434 QTest::qWait(25); |
|
1435 SubQGraphicsWidget *w1_3 = new SubQGraphicsWidget; |
|
1436 w1_3->setFocusPolicy(Qt::StrongFocus); |
|
1437 w1_3->setData(0, "w1_3"); |
|
1438 w1_3->setGeometry(50,0,25, 25); |
|
1439 scene.addItem(w1_3); |
|
1440 QTRY_VERIFY(w1_2->hasFocus()); |
|
1441 QTest::keyPress(QApplication::focusWidget(), Qt::Key_Backtab); |
|
1442 QTest::qWait(25); |
|
1443 QTRY_VERIFY(lineEdit->hasFocus()); |
|
1444 // tabFocusFirst should now point to w1_2 |
|
1445 QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); |
|
1446 QTest::qWait(25); |
|
1447 QTRY_VERIFY(w1_2->hasFocus()); |
|
1448 QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); |
|
1449 QTest::qWait(25); |
|
1450 QTRY_VERIFY(w1_3->hasFocus()); |
|
1451 scene.removeItem(w1_2); // does not call _q_removeItemLater |
|
1452 delete w1_2; // calls _q_removeItemLater |
|
1453 |
|
1454 SubQGraphicsWidget *w1_4 = new SubQGraphicsWidget; |
|
1455 w1_4->setFocusPolicy(Qt::StrongFocus); |
|
1456 w1_4->setData(0, "w1_4"); |
|
1457 w1_4->setGeometry(75,0,25, 25); |
|
1458 scene.addItem(w1_4); |
|
1459 QTRY_VERIFY(w1_3->hasFocus()); |
|
1460 QTest::qWait(25); |
|
1461 QTRY_VERIFY(compareFocusChain(view, QList<QGraphicsItem*>() << w1_3 << w1_4)); |
|
1462 QTest::keyPress(QApplication::focusWidget(), Qt::Key_Backtab); |
|
1463 QTest::qWait(25); |
|
1464 QTRY_VERIFY(lineEdit->hasFocus()); |
|
1465 // tabFocusFirst should now point to w1_3 |
|
1466 QTest::keyPress(QApplication::focusWidget(), Qt::Key_Tab); |
|
1467 QTest::qWait(25); |
|
1468 QTRY_VERIFY(w1_3->hasFocus()); |
|
1469 QTest::qWait(25); |
|
1470 QTRY_VERIFY(compareFocusChain(view, QList<QGraphicsItem*>() << w1_3 << w1_4)); |
|
1471 delete window; |
|
1472 } |
|
1473 } |
|
1474 |
|
1475 void tst_QGraphicsWidget::updateFocusChainWhenChildDie() |
|
1476 { |
|
1477 QGraphicsScene scene; |
|
1478 QGraphicsView view(&scene); |
|
1479 view.show(); |
|
1480 #ifdef Q_WS_X11 |
|
1481 qt_x11_wait_for_window_manager(&view); |
|
1482 #endif |
|
1483 QApplication::setActiveWindow(&view); |
|
1484 QTest::qWait(25); |
|
1485 QTRY_COMPARE(QApplication::activeWindow(), &view); |
|
1486 |
|
1487 // delete item in focus chain with no focus and verify chain |
|
1488 SubQGraphicsWidget *parent = new SubQGraphicsWidget(0, Qt::Window); |
|
1489 SubQGraphicsWidget *w = new SubQGraphicsWidget(0, Qt::Window); |
|
1490 w->resize(50,50); |
|
1491 w->resize(100,100); |
|
1492 SubQGraphicsWidget *w1_1 = new SubQGraphicsWidget(w); |
|
1493 w1_1->setFocusPolicy(Qt::StrongFocus); |
|
1494 w->setFocusPolicy(Qt::StrongFocus); |
|
1495 scene.addItem(w); |
|
1496 scene.addItem(parent); |
|
1497 w1_1->setFocus(); |
|
1498 |
|
1499 QVERIFY(w1_1->hasFocus()); |
|
1500 QWidget myWidget(0); |
|
1501 QLineEdit edit(&myWidget); |
|
1502 myWidget.show(); |
|
1503 edit.setFocus(); |
|
1504 QTRY_VERIFY(edit.hasFocus()); |
|
1505 delete w1_1; |
|
1506 myWidget.hide(); |
|
1507 w->setParentItem(parent); |
|
1508 //We don't crash perfect |
|
1509 QVERIFY(w); |
|
1510 QTest::mouseMove(view.viewport()); |
|
1511 QTest::mouseClick(view.viewport(), Qt::LeftButton, 0); |
|
1512 QTRY_COMPARE(qApp->activeWindow(), static_cast<QWidget *>(&view)); |
|
1513 QTRY_COMPARE(scene.focusItem(), static_cast<QGraphicsItem *>(w)); |
|
1514 } |
|
1515 |
|
1516 void tst_QGraphicsWidget::sizeHint_data() |
|
1517 { |
|
1518 QTest::addColumn<bool>("layout"); |
|
1519 QTest::newRow("no layout") << false; |
|
1520 QTest::newRow("layout") << true; |
|
1521 } |
|
1522 |
|
1523 // QSizeF sizeHint(Qt::SizeHint which, QSizeF const& constraint = QSizeF()) const protected |
|
1524 void tst_QGraphicsWidget::sizeHint() |
|
1525 { |
|
1526 QFETCH(bool, layout); |
|
1527 SubQGraphicsWidget widget; |
|
1528 |
|
1529 if (layout) { |
|
1530 QGraphicsLinearLayout *layout = new QGraphicsLinearLayout; |
|
1531 widget.setLayout(layout); |
|
1532 } |
|
1533 widget.call_sizeHint(Qt::MinimumSize, QSizeF()); |
|
1534 } |
|
1535 |
|
1536 void tst_QGraphicsWidget::consistentPosSizeGeometry_data() |
|
1537 { |
|
1538 QTest::addColumn<QSizeF>("minSize"); |
|
1539 QTest::addColumn<QSizeF>("maxSize"); |
|
1540 QTest::addColumn<QRectF>("geometry"); |
|
1541 QTest::addColumn<QRectF>("expectedGeometry"); |
|
1542 |
|
1543 QTest::newRow("size is valid") << QSizeF(0, 0) << QSizeF(200, 200) << QRectF(0, 0, 100, 100) << QRectF(0, 0, 100, 100); |
|
1544 QTest::newRow("size is larger than max") << QSizeF(0, 0) << QSizeF(50, 50) << QRectF(0, 0, 100, 100) << QRectF(0, 0, 50, 50); |
|
1545 QTest::newRow("size is smaller than min") << QSizeF(50, 50) << QSizeF(150, 150) << QRectF(0, 0, 10, 10) << QRectF(0, 0, 50, 50); |
|
1546 } |
|
1547 |
|
1548 void tst_QGraphicsWidget::consistentPosSizeGeometry() |
|
1549 { |
|
1550 QFETCH(QSizeF, minSize); |
|
1551 QFETCH(QSizeF, maxSize); |
|
1552 QFETCH(QRectF, geometry); |
|
1553 QFETCH(QRectF, expectedGeometry); |
|
1554 |
|
1555 QGraphicsScene scene; |
|
1556 QGraphicsView view(&scene); |
|
1557 QGraphicsWidget *w = new QGraphicsWidget; |
|
1558 scene.addItem(w); |
|
1559 w->setMinimumSize(minSize); |
|
1560 w->setMaximumSize(maxSize); |
|
1561 w->setGeometry(geometry); |
|
1562 QCOMPARE(w->geometry(), expectedGeometry); |
|
1563 QCOMPARE(w->pos(), expectedGeometry.topLeft()); |
|
1564 QCOMPARE(w->size(), expectedGeometry.size()); |
|
1565 |
|
1566 QRectF otherGeom = QRectF(QPointF(12.34,12.34), minSize); |
|
1567 w->setGeometry(otherGeom); |
|
1568 QCOMPARE(w->geometry(), otherGeom); |
|
1569 QCOMPARE(w->pos(), otherGeom.topLeft()); |
|
1570 QCOMPARE(w->size(), otherGeom.size()); |
|
1571 |
|
1572 w->setPos(geometry.topLeft()); |
|
1573 QCOMPARE(w->geometry().topLeft(), expectedGeometry.topLeft()); |
|
1574 QCOMPARE(w->pos(), expectedGeometry.topLeft()); |
|
1575 |
|
1576 w->resize(geometry.size()); |
|
1577 QCOMPARE(w->geometry().size(), expectedGeometry.size()); |
|
1578 QCOMPARE(w->geometry(), expectedGeometry); |
|
1579 |
|
1580 view.show(); |
|
1581 |
|
1582 } |
|
1583 |
|
1584 |
|
1585 enum WhichSize { |
|
1586 MinimumWidth, |
|
1587 PreferredWidth, |
|
1588 MaximumWidth, |
|
1589 MinimumHeight, |
|
1590 PreferredHeight, |
|
1591 MaximumHeight, |
|
1592 MinimumSize, |
|
1593 PreferredSize, |
|
1594 MaximumSize, |
|
1595 MinimumSizeHint, |
|
1596 PreferredSizeHint, |
|
1597 MaximumSizeHint, |
|
1598 Size, |
|
1599 None, |
|
1600 }; |
|
1601 |
|
1602 typedef QPair<int, QVariant> Inst; |
|
1603 |
|
1604 Q_DECLARE_METATYPE(Inst) |
|
1605 Q_DECLARE_METATYPE(QVector<Inst>) |
|
1606 |
|
1607 void tst_QGraphicsWidget::setSizes_data() |
|
1608 { |
|
1609 |
|
1610 QTest::addColumn<QVector<Inst> >("inputInstructions"); |
|
1611 QTest::addColumn<QVector<Inst> >("compareInstructions"); |
|
1612 |
|
1613 QTest::newRow("minSize1") << (QVector<Inst>() << Inst(Size, QSize(25, 25)) << Inst(MinimumSize, QSize(10, 10))) |
|
1614 << (QVector<Inst>() << Inst(Size, QSize(25,25))); |
|
1615 QTest::newRow("minSize2") << (QVector<Inst>() << Inst(Size, QSizeF(20, 20)) << Inst(MinimumSize, QSizeF(25, 25))) |
|
1616 << (QVector<Inst>() << Inst(Size, QSizeF(25, 25))); |
|
1617 QTest::newRow("minWidth1") << (QVector<Inst>() << Inst(Size, QSizeF(20, 20)) << Inst(MinimumWidth, 5.0)) |
|
1618 << (QVector<Inst>() << Inst(Size, QSizeF(20, 20))); |
|
1619 QTest::newRow("minWidth2") << (QVector<Inst>() << Inst(Size, QSizeF(20, 20)) << Inst(MinimumWidth, 25.0)) |
|
1620 << (QVector<Inst>() << Inst(Size, QSizeF(25, 20))); |
|
1621 QTest::newRow("minHeight1") << (QVector<Inst>() << Inst(Size, QSizeF(20, 20)) << Inst(MinimumHeight, 5.0)) |
|
1622 << (QVector<Inst>() << Inst(Size, QSizeF(20, 20))); |
|
1623 QTest::newRow("minHeight2") << (QVector<Inst>() << Inst(Size, QSizeF(20, 20)) << Inst(MinimumHeight, 25.0)) |
|
1624 << (QVector<Inst>() << Inst(Size, QSizeF(20, 25))); |
|
1625 QTest::newRow("maxSize1") << (QVector<Inst>() << Inst(Size, QSizeF(40, 40)) << Inst(MaximumSize, QSizeF(30, 30))) |
|
1626 << (QVector<Inst>() << Inst(Size, QSizeF(30, 30))); |
|
1627 QTest::newRow("maxSize2") << (QVector<Inst>() << Inst(Size, QSizeF(40, 40)) << Inst(MaximumSize, QSizeF(30, -1))) |
|
1628 << (QVector<Inst>() << Inst(Size, QSizeF(30, 40))); |
|
1629 QTest::newRow("maxSize3") << (QVector<Inst>() << Inst(Size, QSizeF(40, 40)) << Inst(MaximumSize, QSizeF(-1, 30))) |
|
1630 << (QVector<Inst>() << Inst(Size, QSizeF(40, 30))); |
|
1631 QTest::newRow("maxWidth1")<< (QVector<Inst>() << Inst(Size, QSizeF(40, 40)) << Inst(MaximumWidth, 30)) |
|
1632 << (QVector<Inst>() << Inst(Size, QSizeF(30, 40))); |
|
1633 QTest::newRow("maxHeight")<< (QVector<Inst>() << Inst(Size, QSizeF(40, 40)) << Inst(MaximumHeight, 20)) |
|
1634 << (QVector<Inst>() << Inst(Size, QSizeF(40, 20))); |
|
1635 QTest::newRow("unsetMinSize")<< (QVector<Inst>() << Inst(Size, QSizeF(40, 40)) << Inst(MinimumSize, QSizeF(-1, -1))) |
|
1636 << (QVector<Inst>() << Inst(MinimumSize, QSizeF(5, 5))); |
|
1637 QTest::newRow("unsetMaxSize")<< (QVector<Inst>() << Inst(Size, QSizeF(40, 40)) << Inst(MaximumSize, QSizeF(-1, -1))) |
|
1638 << (QVector<Inst>() << Inst(MaximumSize, QSizeF(500, 500))); |
|
1639 QTest::newRow("unsetMinSize, expand size to minimumSizeHint") << (QVector<Inst>() |
|
1640 << Inst(MinimumSize, QSize(0, 0)) |
|
1641 << Inst(Size, QSize(1,1)) |
|
1642 << Inst(MinimumSize, QSize(-1.0, -1.0)) |
|
1643 ) |
|
1644 << (QVector<Inst>() |
|
1645 << Inst(Size, QSize(5,5)) |
|
1646 << Inst(MinimumSize, QSize(5,5)) |
|
1647 ); |
|
1648 |
|
1649 } |
|
1650 |
|
1651 void tst_QGraphicsWidget::setSizes() |
|
1652 { |
|
1653 QFETCH(QVector<Inst>, inputInstructions); |
|
1654 QFETCH(QVector<Inst>, compareInstructions); |
|
1655 |
|
1656 QGraphicsScene scene; |
|
1657 QGraphicsView view(&scene); |
|
1658 SizeHinter *widget = new SizeHinter(0, Qt::Window); |
|
1659 QSizeF min = QSizeF(10, 10); |
|
1660 QSizeF pref = QSizeF(25, 25); |
|
1661 QSizeF max = QSizeF(50, 50); |
|
1662 |
|
1663 int i; |
|
1664 for (i = 0; i < inputInstructions.count(); ++i) { |
|
1665 Inst input = inputInstructions.at(i); |
|
1666 |
|
1667 // defaults |
|
1668 switch (input.first) { |
|
1669 case MinimumSize: |
|
1670 min = input.second.toSizeF(); |
|
1671 break; |
|
1672 case PreferredSize: |
|
1673 pref = input.second.toSizeF(); |
|
1674 break; |
|
1675 case MaximumSize: |
|
1676 max = input.second.toSizeF(); |
|
1677 break; |
|
1678 case Size: |
|
1679 widget->resize(input.second.toSizeF()); |
|
1680 break; |
|
1681 case MinimumWidth: |
|
1682 widget->setMinimumWidth(qreal(input.second.toDouble())); |
|
1683 break; |
|
1684 case PreferredWidth: |
|
1685 widget->setPreferredWidth(qreal(input.second.toDouble())); |
|
1686 break; |
|
1687 case MaximumWidth: |
|
1688 widget->setMaximumWidth(qreal(input.second.toDouble())); |
|
1689 break; |
|
1690 case MinimumHeight: |
|
1691 widget->setMinimumHeight(qreal(input.second.toDouble())); |
|
1692 break; |
|
1693 case PreferredHeight: |
|
1694 widget->setPreferredHeight(qreal(input.second.toDouble())); |
|
1695 break; |
|
1696 case MaximumHeight: |
|
1697 widget->setMaximumHeight(qreal(input.second.toDouble())); |
|
1698 break; |
|
1699 case MinimumSizeHint: |
|
1700 widget->setSizeHint(Qt::MinimumSize, input.second.toSizeF()); |
|
1701 break; |
|
1702 case PreferredSizeHint: |
|
1703 widget->setSizeHint(Qt::PreferredSize, input.second.toSizeF()); |
|
1704 break; |
|
1705 case MaximumSizeHint: |
|
1706 widget->setSizeHint(Qt::MaximumSize, input.second.toSizeF()); |
|
1707 break; |
|
1708 default: |
|
1709 qWarning("instruction not implemented"); |
|
1710 break; |
|
1711 } |
|
1712 } |
|
1713 |
|
1714 widget->setMinimumSize(min); |
|
1715 widget->setPreferredSize(pref); |
|
1716 widget->setMaximumSize(max); |
|
1717 |
|
1718 QApplication::processEvents(); |
|
1719 |
|
1720 for (i = 0; i < compareInstructions.count(); ++i) { |
|
1721 Inst input = compareInstructions.at(i); |
|
1722 switch (input.first) { |
|
1723 case MinimumSize: |
|
1724 QCOMPARE(widget->minimumSize(), input.second.toSizeF()); |
|
1725 break; |
|
1726 case PreferredSize: |
|
1727 QCOMPARE(widget->preferredSize(), input.second.toSizeF()); |
|
1728 break; |
|
1729 case MaximumSize: |
|
1730 QCOMPARE(widget->maximumSize(), input.second.toSizeF()); |
|
1731 break; |
|
1732 case Size: |
|
1733 QCOMPARE(widget->size(), input.second.toSizeF()); |
|
1734 break; |
|
1735 case MinimumWidth: |
|
1736 QCOMPARE(widget->minimumWidth(), qreal(input.second.toDouble())); |
|
1737 break; |
|
1738 case PreferredWidth: |
|
1739 QCOMPARE(widget->preferredWidth(), qreal(input.second.toDouble())); |
|
1740 break; |
|
1741 case MaximumWidth: |
|
1742 QCOMPARE(widget->maximumWidth(), qreal(input.second.toDouble())); |
|
1743 break; |
|
1744 default: |
|
1745 qWarning("instruction not implemented"); |
|
1746 break; |
|
1747 } |
|
1748 } |
|
1749 delete widget; |
|
1750 } |
|
1751 |
|
1752 void tst_QGraphicsWidget::closePopupOnOutsideClick() |
|
1753 { |
|
1754 QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Popup); |
|
1755 widget->resize(100, 100); |
|
1756 |
|
1757 QGraphicsScene scene; |
|
1758 scene.addItem(widget); |
|
1759 |
|
1760 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); |
|
1761 event.ignore(); |
|
1762 event.setScenePos(QPointF(50, 50)); |
|
1763 qApp->sendEvent(&scene, &event); |
|
1764 |
|
1765 QVERIFY(widget->isVisible()); |
|
1766 QVERIFY(event.isAccepted()); |
|
1767 |
|
1768 event.ignore(); |
|
1769 event.setScenePos(QPointF(150, 150)); |
|
1770 qApp->sendEvent(&scene, &event); |
|
1771 |
|
1772 QVERIFY(!widget->isVisible()); |
|
1773 QVERIFY(event.isAccepted()); |
|
1774 } |
|
1775 |
|
1776 void tst_QGraphicsWidget::task236127_bspTreeIndexFails() |
|
1777 { |
|
1778 QGraphicsWidget *widget = new QGraphicsWidget; |
|
1779 QGraphicsWidget *widget2 = new QGraphicsWidget; |
|
1780 widget->resize(10, 10); |
|
1781 widget2->resize(10, 10); |
|
1782 widget2->setZValue(1); |
|
1783 QCOMPARE(widget2->zValue(), qreal(1)); |
|
1784 QCOMPARE(widget->zValue(), qreal(0)); |
|
1785 widget->setData(0, "widget"); |
|
1786 widget2->setData(0, "widget2"); |
|
1787 |
|
1788 QGraphicsScene scene; |
|
1789 scene.addItem(widget); |
|
1790 scene.addItem(widget2); |
|
1791 |
|
1792 QGraphicsView view(&scene); |
|
1793 view.show(); |
|
1794 #ifdef Q_WS_X11 |
|
1795 qt_x11_wait_for_window_manager(&view); |
|
1796 #endif |
|
1797 QTest::qWait(100); |
|
1798 |
|
1799 QVERIFY(!scene.itemAt(25, 25)); |
|
1800 widget->setGeometry(0, 112, 360, 528); |
|
1801 QCOMPARE(scene.itemAt(15, 120), (QGraphicsItem *)widget); |
|
1802 widget2->setGeometry(0, 573, 360, 67); |
|
1803 QCOMPARE(scene.itemAt(15, 120), (QGraphicsItem *)widget); |
|
1804 QCOMPARE(scene.itemAt(50, 585), (QGraphicsItem *)widget2); |
|
1805 } |
|
1806 |
|
1807 void tst_QGraphicsWidget::defaultSize() |
|
1808 { |
|
1809 SubQGraphicsWidget *widget = new SubQGraphicsWidget; |
|
1810 widget->setMinimumSize(40, 40); |
|
1811 QGraphicsScene scene; |
|
1812 scene.addItem(widget); |
|
1813 |
|
1814 QGraphicsView view(&scene); |
|
1815 view.show(); |
|
1816 #ifdef Q_WS_X11 |
|
1817 qt_x11_wait_for_window_manager(&view); |
|
1818 #endif |
|
1819 QTest::qWait(50); |
|
1820 QSizeF initialSize = widget->size(); |
|
1821 |
|
1822 widget->resize(initialSize); |
|
1823 QCOMPARE(widget->geometry().size(), initialSize); |
|
1824 widget->setVisible(false); |
|
1825 widget->setMinimumSize(10, 10); |
|
1826 widget->setPreferredSize(60, 60); |
|
1827 widget->setMaximumSize(110, 110); |
|
1828 widget->setVisible(true); |
|
1829 QTest::qWait(50); |
|
1830 // should still have its size set to initialsize |
|
1831 QCOMPARE(widget->geometry().size(), initialSize); |
|
1832 |
|
1833 } |
|
1834 |
|
1835 void tst_QGraphicsWidget::explicitMouseGrabber() |
|
1836 { |
|
1837 QGraphicsWidget *widget = new QGraphicsWidget; |
|
1838 EventSpy widgetGrabEventSpy(widget, QEvent::GrabMouse); |
|
1839 EventSpy widgetUngrabEventSpy(widget, QEvent::UngrabMouse); |
|
1840 |
|
1841 // Grab without scene |
|
1842 QTest::ignoreMessage(QtWarningMsg, "QGraphicsItem::grabMouse: cannot grab mouse without scene"); |
|
1843 widget->grabMouse(); |
|
1844 QCOMPARE(widgetGrabEventSpy.count(), 0); |
|
1845 QTest::ignoreMessage(QtWarningMsg, "QGraphicsItem::ungrabMouse: cannot ungrab mouse without scene"); |
|
1846 widget->ungrabMouse(); |
|
1847 QCOMPARE(widgetUngrabEventSpy.count(), 0); |
|
1848 |
|
1849 // Add to scene |
|
1850 QGraphicsScene scene; |
|
1851 scene.addItem(widget); |
|
1852 |
|
1853 // Ungrab while not grabber |
|
1854 QTest::ignoreMessage(QtWarningMsg, "QGraphicsItem::ungrabMouse: not a mouse grabber"); |
|
1855 widget->ungrabMouse(); |
|
1856 |
|
1857 // Simple grab with scene |
|
1858 QVERIFY(!scene.mouseGrabberItem()); |
|
1859 widget->grabMouse(); |
|
1860 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
1861 QCOMPARE(widgetGrabEventSpy.count(), 1); |
|
1862 widget->ungrabMouse(); |
|
1863 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); |
|
1864 QCOMPARE(widgetUngrabEventSpy.count(), 1); |
|
1865 |
|
1866 // Grab while grabbing |
|
1867 widget->grabMouse(); |
|
1868 QCOMPARE(widgetGrabEventSpy.count(), 2); |
|
1869 QTest::ignoreMessage(QtWarningMsg, "QGraphicsItem::grabMouse: already a mouse grabber"); |
|
1870 widget->grabMouse(); |
|
1871 QCOMPARE(widgetGrabEventSpy.count(), 2); |
|
1872 QCOMPARE(widgetUngrabEventSpy.count(), 1); |
|
1873 widget->ungrabMouse(); |
|
1874 QCOMPARE(widgetUngrabEventSpy.count(), 2); |
|
1875 |
|
1876 // Add two more widgets to the scene |
|
1877 QGraphicsWidget *widget2 = new QGraphicsWidget; |
|
1878 scene.addItem(widget2); |
|
1879 EventSpy widget2GrabEventSpy(widget2, QEvent::GrabMouse); |
|
1880 EventSpy widget2UngrabEventSpy(widget2, QEvent::UngrabMouse); |
|
1881 QGraphicsWidget *widget3 = new QGraphicsWidget; |
|
1882 scene.addItem(widget3); |
|
1883 EventSpy widget3GrabEventSpy(widget3, QEvent::GrabMouse); |
|
1884 EventSpy widget3UngrabEventSpy(widget3, QEvent::UngrabMouse); |
|
1885 |
|
1886 widget->setData(0, "widget"); |
|
1887 widget2->setData(0, "widget2"); |
|
1888 widget3->setData(0, "widget3"); |
|
1889 |
|
1890 // Simple nested grabbing |
|
1891 widget->grabMouse(); |
|
1892 QCOMPARE(widgetGrabEventSpy.count(), 3); |
|
1893 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
1894 widget2->grabMouse(); |
|
1895 QCOMPARE(widgetUngrabEventSpy.count(), 3); |
|
1896 QCOMPARE(widget2GrabEventSpy.count(), 1); |
|
1897 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget2); |
|
1898 widget3->grabMouse(); |
|
1899 QCOMPARE(widget2UngrabEventSpy.count(), 1); |
|
1900 QCOMPARE(widget3GrabEventSpy.count(), 1); |
|
1901 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget3); |
|
1902 widget3->ungrabMouse(); |
|
1903 QCOMPARE(widget3UngrabEventSpy.count(), 1); |
|
1904 QCOMPARE(widget2GrabEventSpy.count(), 2); |
|
1905 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget2); |
|
1906 widget2->ungrabMouse(); |
|
1907 QCOMPARE(widget2UngrabEventSpy.count(), 2); |
|
1908 QCOMPARE(widgetGrabEventSpy.count(), 4); |
|
1909 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
1910 widget->ungrabMouse(); |
|
1911 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); |
|
1912 |
|
1913 // Out of order ungrab |
|
1914 widget->grabMouse(); |
|
1915 QCOMPARE(widgetGrabEventSpy.count(), 5); |
|
1916 widget2->grabMouse(); |
|
1917 QCOMPARE(widget2GrabEventSpy.count(), 3); |
|
1918 widget3->grabMouse(); |
|
1919 QCOMPARE(widget3GrabEventSpy.count(), 2); |
|
1920 widget2->ungrabMouse(); |
|
1921 QCOMPARE(widget3UngrabEventSpy.count(), 2); |
|
1922 QCOMPARE(widget2UngrabEventSpy.count(), 4); |
|
1923 QCOMPARE(widgetGrabEventSpy.count(), 6); |
|
1924 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
1925 } |
|
1926 |
|
1927 void tst_QGraphicsWidget::implicitMouseGrabber() |
|
1928 { |
|
1929 QGraphicsScene scene; |
|
1930 QGraphicsWidget *widget = new QGraphicsWidget; |
|
1931 widget->setFlag(QGraphicsItem::ItemIsMovable); // can grab mouse |
|
1932 widget->resize(200, 200); |
|
1933 EventSpy widgetGrabEventSpy(widget, QEvent::GrabMouse); |
|
1934 EventSpy widgetUngrabEventSpy(widget, QEvent::UngrabMouse); |
|
1935 scene.addItem(widget); |
|
1936 |
|
1937 QVERIFY(!scene.mouseGrabberItem()); |
|
1938 |
|
1939 // Click on an item, see if gain and lose implicit mouse grab. |
|
1940 { |
|
1941 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); |
|
1942 event.ignore(); |
|
1943 event.setButton(Qt::LeftButton); |
|
1944 event.setScenePos(QPointF(50, 50)); |
|
1945 qApp->sendEvent(&scene, &event); |
|
1946 } |
|
1947 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
1948 QCOMPARE(widgetGrabEventSpy.count(), 1); |
|
1949 { |
|
1950 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseRelease); |
|
1951 event.ignore(); |
|
1952 event.setButton(Qt::LeftButton); |
|
1953 event.setScenePos(QPointF(50, 50)); |
|
1954 qApp->sendEvent(&scene, &event); |
|
1955 } |
|
1956 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); |
|
1957 QCOMPARE(widgetGrabEventSpy.count(), 1); |
|
1958 QCOMPARE(widgetUngrabEventSpy.count(), 1); |
|
1959 |
|
1960 // Click on an item that already grabs the mouse. Shouldn't have any effect. |
|
1961 widget->grabMouse(); |
|
1962 QCOMPARE(widgetGrabEventSpy.count(), 2); |
|
1963 { |
|
1964 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); |
|
1965 event.ignore(); |
|
1966 event.setButton(Qt::LeftButton); |
|
1967 event.setScenePos(QPointF(50, 50)); |
|
1968 qApp->sendEvent(&scene, &event); |
|
1969 } |
|
1970 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
1971 QCOMPARE(widgetGrabEventSpy.count(), 2); |
|
1972 { |
|
1973 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseRelease); |
|
1974 event.ignore(); |
|
1975 event.setButton(Qt::LeftButton); |
|
1976 event.setScenePos(QPointF(50, 50)); |
|
1977 qApp->sendEvent(&scene, &event); |
|
1978 } |
|
1979 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
1980 QCOMPARE(widgetGrabEventSpy.count(), 2); |
|
1981 QCOMPARE(widgetUngrabEventSpy.count(), 1); |
|
1982 widget->ungrabMouse(); |
|
1983 QCOMPARE(widgetUngrabEventSpy.count(), 2); |
|
1984 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); |
|
1985 |
|
1986 // Implicit mouse grabber tries to explicitly grab the mouse |
|
1987 { |
|
1988 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); |
|
1989 event.ignore(); |
|
1990 event.setButton(Qt::LeftButton); |
|
1991 event.setScenePos(QPointF(50, 50)); |
|
1992 qApp->sendEvent(&scene, &event); |
|
1993 } |
|
1994 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
1995 QCOMPARE(widgetGrabEventSpy.count(), 3); |
|
1996 widget->grabMouse(); |
|
1997 QCOMPARE(widgetUngrabEventSpy.count(), 2); |
|
1998 { |
|
1999 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseRelease); |
|
2000 event.ignore(); |
|
2001 event.setButton(Qt::LeftButton); |
|
2002 event.setScenePos(QPointF(50, 50)); |
|
2003 qApp->sendEvent(&scene, &event); |
|
2004 } |
|
2005 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
2006 QCOMPARE(widgetGrabEventSpy.count(), 3); |
|
2007 QCOMPARE(widgetUngrabEventSpy.count(), 2); |
|
2008 widget->ungrabMouse(); |
|
2009 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); |
|
2010 QCOMPARE(widgetGrabEventSpy.count(), 3); |
|
2011 QCOMPARE(widgetUngrabEventSpy.count(), 3); |
|
2012 |
|
2013 // Arrival of a new widget |
|
2014 QGraphicsWidget *widget2 = new QGraphicsWidget; |
|
2015 widget2->setFlag(QGraphicsItem::ItemIsMovable); // can grab mouse |
|
2016 widget2->resize(200, 200); |
|
2017 widget2->setPos(205, 0); |
|
2018 EventSpy widget2GrabEventSpy(widget2, QEvent::GrabMouse); |
|
2019 EventSpy widget2UngrabEventSpy(widget2, QEvent::UngrabMouse); |
|
2020 scene.addItem(widget2); |
|
2021 |
|
2022 // Implicit grab while there's an explicit grab is not possible. |
|
2023 widget->grabMouse(); |
|
2024 QCOMPARE(widgetGrabEventSpy.count(), 4); |
|
2025 { |
|
2026 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); |
|
2027 event.ignore(); |
|
2028 event.setButton(Qt::LeftButton); |
|
2029 event.setScenePos(QPointF(250, 50)); |
|
2030 qApp->sendEvent(&scene, &event); |
|
2031 } |
|
2032 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
2033 QCOMPARE(widgetGrabEventSpy.count(), 4); |
|
2034 QCOMPARE(widget2GrabEventSpy.count(), 0); |
|
2035 QCOMPARE(widget2UngrabEventSpy.count(), 0); |
|
2036 |
|
2037 scene.removeItem(widget); |
|
2038 QCOMPARE(widgetUngrabEventSpy.count(), 4); |
|
2039 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); |
|
2040 } |
|
2041 |
|
2042 class GrabOnPressItem : public QGraphicsRectItem |
|
2043 { |
|
2044 public: |
|
2045 GrabOnPressItem(const QRectF &rect) |
|
2046 : QGraphicsRectItem(rect), |
|
2047 npress(0), nrelease(0), ndoubleClick(0), |
|
2048 ngrab(0), nungrab(0) |
|
2049 { |
|
2050 } |
|
2051 int npress; |
|
2052 int nrelease; |
|
2053 int ndoubleClick; |
|
2054 int ngrab; |
|
2055 int nungrab; |
|
2056 protected: |
|
2057 bool sceneEvent(QEvent *event) |
|
2058 { |
|
2059 switch (event->type()) { |
|
2060 case QEvent::GrabMouse: |
|
2061 ++ngrab; |
|
2062 break; |
|
2063 case QEvent::UngrabMouse: |
|
2064 ++nungrab; |
|
2065 break; |
|
2066 default: |
|
2067 break; |
|
2068 } |
|
2069 return QGraphicsRectItem::sceneEvent(event); |
|
2070 } |
|
2071 |
|
2072 void mousePressEvent(QGraphicsSceneMouseEvent *) |
|
2073 { |
|
2074 grabMouse(); |
|
2075 ++npress; |
|
2076 } |
|
2077 void mouseReleaseEvent(QGraphicsSceneMouseEvent *) |
|
2078 { |
|
2079 ungrabMouse(); |
|
2080 ++nrelease; |
|
2081 } |
|
2082 void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *) |
|
2083 { |
|
2084 ++ndoubleClick; |
|
2085 } |
|
2086 }; |
|
2087 |
|
2088 void tst_QGraphicsWidget::doubleClickAfterExplicitMouseGrab() |
|
2089 { |
|
2090 QGraphicsScene scene; |
|
2091 GrabOnPressItem *item = new GrabOnPressItem(QRectF(0, 0, 100, 100)); |
|
2092 scene.addItem(item); |
|
2093 |
|
2094 { |
|
2095 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); |
|
2096 event.setButton(Qt::LeftButton); |
|
2097 event.setButtons(Qt::LeftButton); |
|
2098 event.ignore(); |
|
2099 event.setScenePos(QPointF(50, 50)); |
|
2100 qApp->sendEvent(&scene, &event); |
|
2101 } |
|
2102 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)item); |
|
2103 QCOMPARE(item->npress, 1); |
|
2104 QCOMPARE(item->ngrab, 1); |
|
2105 { |
|
2106 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseRelease); |
|
2107 event.setButton(Qt::LeftButton); |
|
2108 event.setButtons(0); |
|
2109 event.ignore(); |
|
2110 event.setScenePos(QPointF(50, 50)); |
|
2111 qApp->sendEvent(&scene, &event); |
|
2112 } |
|
2113 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); |
|
2114 QCOMPARE(item->nrelease, 1); |
|
2115 QCOMPARE(item->nungrab, 1); |
|
2116 { |
|
2117 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseDoubleClick); |
|
2118 event.setButton(Qt::LeftButton); |
|
2119 event.setButtons(Qt::LeftButton); |
|
2120 event.ignore(); |
|
2121 event.setScenePos(QPointF(50, 50)); |
|
2122 qApp->sendEvent(&scene, &event); |
|
2123 } |
|
2124 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)item); |
|
2125 QCOMPARE(item->ndoubleClick, 1); |
|
2126 QCOMPARE(item->ngrab, 2); |
|
2127 { |
|
2128 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseRelease); |
|
2129 event.setButton(Qt::LeftButton); |
|
2130 event.setButtons(0); |
|
2131 event.ignore(); |
|
2132 event.setScenePos(QPointF(50, 50)); |
|
2133 qApp->sendEvent(&scene, &event); |
|
2134 } |
|
2135 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); |
|
2136 QCOMPARE(item->nrelease, 2); |
|
2137 QCOMPARE(item->nungrab, 2); |
|
2138 } |
|
2139 |
|
2140 void tst_QGraphicsWidget::popupMouseGrabber() |
|
2141 { |
|
2142 QGraphicsScene scene; |
|
2143 QGraphicsWidget *widget = new QGraphicsWidget(0, Qt::Popup); |
|
2144 widget->setFlag(QGraphicsItem::ItemIsMovable); // can grab mouse |
|
2145 widget->resize(200, 200); |
|
2146 EventSpy widgetGrabEventSpy(widget, QEvent::GrabMouse); |
|
2147 EventSpy widgetUngrabEventSpy(widget, QEvent::UngrabMouse); |
|
2148 |
|
2149 // Simply adding a visible popup to the scene immediately grabs the mouse. |
|
2150 scene.addItem(widget); |
|
2151 QCOMPARE(widgetGrabEventSpy.count(), 1); |
|
2152 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
2153 |
|
2154 // Hiding it loses the grab again. |
|
2155 widget->hide(); |
|
2156 QCOMPARE(widgetUngrabEventSpy.count(), 1); |
|
2157 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)0); |
|
2158 |
|
2159 // Showing it grabs the mosue again |
|
2160 widget->show(); |
|
2161 QCOMPARE(widgetGrabEventSpy.count(), 2); |
|
2162 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget); |
|
2163 |
|
2164 // Add two popups |
|
2165 QGraphicsWidget *widget2 = new QGraphicsWidget(0, Qt::Popup); |
|
2166 widget2->setFlag(QGraphicsItem::ItemIsMovable); // can grab mouse |
|
2167 widget2->resize(200, 200); |
|
2168 EventSpy widget2GrabEventSpy(widget2, QEvent::GrabMouse); |
|
2169 EventSpy widget2UngrabEventSpy(widget2, QEvent::UngrabMouse); |
|
2170 QGraphicsWidget *widget3 = new QGraphicsWidget(0, Qt::Popup); |
|
2171 widget3->setFlag(QGraphicsItem::ItemIsMovable); // can grab mouse |
|
2172 widget3->resize(200, 200); |
|
2173 EventSpy widget3GrabEventSpy(widget3, QEvent::GrabMouse); |
|
2174 EventSpy widget3UngrabEventSpy(widget3, QEvent::UngrabMouse); |
|
2175 |
|
2176 // Adding to the scene grabs |
|
2177 scene.addItem(widget2); |
|
2178 QCOMPARE(widgetUngrabEventSpy.count(), 2); |
|
2179 QCOMPARE(widget2GrabEventSpy.count(), 1); |
|
2180 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget2); |
|
2181 |
|
2182 // Adding to the scene grabs again |
|
2183 scene.addItem(widget3); |
|
2184 QCOMPARE(widget2UngrabEventSpy.count(), 1); |
|
2185 QCOMPARE(widget3GrabEventSpy.count(), 1); |
|
2186 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget3); |
|
2187 |
|
2188 // Hiding the topmost widget causes widget 2 to regain grab. |
|
2189 widget3->hide(); |
|
2190 QCOMPARE(widget2GrabEventSpy.count(), 2); |
|
2191 QCOMPARE(widget3UngrabEventSpy.count(), 1); |
|
2192 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget2); |
|
2193 widget3->show(); |
|
2194 QCOMPARE(widget2UngrabEventSpy.count(), 2); |
|
2195 QCOMPARE(widget3GrabEventSpy.count(), 2); |
|
2196 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget3); |
|
2197 |
|
2198 // Clicking outside the popup still causes it to close (despite that it's |
|
2199 // an explicit mouse grabber). |
|
2200 { |
|
2201 QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMousePress); |
|
2202 event.ignore(); |
|
2203 event.setButton(Qt::LeftButton); |
|
2204 event.setScenePos(QPointF(500, 500)); // outside |
|
2205 qApp->sendEvent(&scene, &event); |
|
2206 } |
|
2207 QVERIFY(!widget3->isVisible()); |
|
2208 QCOMPARE(widget3UngrabEventSpy.count(), 2); |
|
2209 QCOMPARE(widget2GrabEventSpy.count(), 3); |
|
2210 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget2); |
|
2211 QVERIFY(widget2->isVisible()); |
|
2212 QVERIFY(widget->isVisible()); |
|
2213 widget3->show(); |
|
2214 QCOMPARE(widget3GrabEventSpy.count(), 3); |
|
2215 QCOMPARE(widget2UngrabEventSpy.count(), 3); |
|
2216 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget3); |
|
2217 |
|
2218 // This is something of a curiosity. What happens if you call |
|
2219 // ungrabMouse() on a popup? The answer is - it loses the grab. If you |
|
2220 // hide and show the popup again, it will regain the grab. |
|
2221 widget3->ungrabMouse(); |
|
2222 QCOMPARE(widget3UngrabEventSpy.count(), 3); |
|
2223 QCOMPARE(widget2GrabEventSpy.count(), 4); |
|
2224 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget2); |
|
2225 widget3->hide(); |
|
2226 widget3->show(); |
|
2227 QCOMPARE(widget3GrabEventSpy.count(), 4); |
|
2228 QCOMPARE(widget2UngrabEventSpy.count(), 4); |
|
2229 QCOMPARE(scene.mouseGrabberItem(), (QGraphicsItem *)widget3); |
|
2230 } |
|
2231 |
|
2232 void tst_QGraphicsWidget::windowFlags_data() |
|
2233 { |
|
2234 QTest::addColumn<int>("inputFlags"); |
|
2235 QTest::addColumn<int>("outputFlags"); |
|
2236 |
|
2237 QTest::newRow("nil") << 0 << 0; |
|
2238 |
|
2239 // Window types |
|
2240 QTest::newRow("Qt::Window") << int(Qt::Window) |
|
2241 << int(Qt::Window | Qt::WindowTitleHint | Qt::WindowSystemMenuHint |
|
2242 | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); |
|
2243 QTest::newRow("Qt::SubWindow") << int(Qt::SubWindow) |
|
2244 << int(Qt::SubWindow | Qt::WindowTitleHint | Qt::WindowSystemMenuHint |
|
2245 | Qt::WindowMinimizeButtonHint | Qt::WindowMaximizeButtonHint); |
|
2246 QTest::newRow("Qt::Dialog") << int(Qt::Dialog) |
|
2247 << int(Qt::Dialog | Qt::WindowTitleHint | Qt::WindowSystemMenuHint |
|
2248 | Qt::WindowContextHelpButtonHint); |
|
2249 QTest::newRow("Qt::Sheet") << int(Qt::Sheet) |
|
2250 << int(Qt::Sheet | Qt::WindowTitleHint | Qt::WindowSystemMenuHint |
|
2251 | Qt::WindowContextHelpButtonHint); |
|
2252 QTest::newRow("Qt::Tool") << int(Qt::Tool) |
|
2253 << int(Qt::Tool | Qt::WindowTitleHint | Qt::WindowSystemMenuHint); |
|
2254 |
|
2255 // Custom window flags |
|
2256 QTest::newRow("Qt::FramelessWindowHint") << int(Qt::FramelessWindowHint) |
|
2257 << int(Qt::FramelessWindowHint); |
|
2258 QTest::newRow("Qt::CustomizeWindowHint") << int(Qt::CustomizeWindowHint) |
|
2259 << int(Qt::CustomizeWindowHint); |
|
2260 } |
|
2261 |
|
2262 void tst_QGraphicsWidget::windowFlags() |
|
2263 { |
|
2264 QFETCH(int, inputFlags); |
|
2265 QFETCH(int, outputFlags); |
|
2266 |
|
2267 // Construct with flags set already |
|
2268 QGraphicsWidget widget(0, Qt::WindowFlags(inputFlags)); |
|
2269 QCOMPARE(widget.windowFlags(), Qt::WindowFlags(outputFlags)); |
|
2270 |
|
2271 // Set flags after construction |
|
2272 QGraphicsWidget widget2; |
|
2273 widget2.setWindowFlags(Qt::WindowFlags(inputFlags)); |
|
2274 QCOMPARE(widget2.windowFlags(), Qt::WindowFlags(outputFlags)); |
|
2275 |
|
2276 // Reset flags |
|
2277 widget2.setWindowFlags(0); |
|
2278 QVERIFY(!widget2.windowFlags()); |
|
2279 |
|
2280 // Set flags back again |
|
2281 widget2.setWindowFlags(Qt::WindowFlags(inputFlags)); |
|
2282 QCOMPARE(widget2.windowFlags(), Qt::WindowFlags(outputFlags)); |
|
2283 |
|
2284 // Construct with custom flags set already |
|
2285 QGraphicsWidget widget3(0, Qt::WindowFlags(inputFlags | Qt::FramelessWindowHint)); |
|
2286 QCOMPARE(widget3.windowFlags(), Qt::WindowFlags(inputFlags | Qt::FramelessWindowHint)); |
|
2287 |
|
2288 // Set custom flags after construction |
|
2289 QGraphicsWidget widget4; |
|
2290 widget4.setWindowFlags(Qt::WindowFlags(inputFlags | Qt::FramelessWindowHint)); |
|
2291 QCOMPARE(widget4.windowFlags(), Qt::WindowFlags(inputFlags | Qt::FramelessWindowHint)); |
|
2292 |
|
2293 // Reset flags |
|
2294 widget4.setWindowFlags(0); |
|
2295 QVERIFY(!widget4.windowFlags()); |
|
2296 |
|
2297 // Set custom flags back again |
|
2298 widget4.setWindowFlags(Qt::WindowFlags(inputFlags | Qt::FramelessWindowHint)); |
|
2299 QCOMPARE(widget4.windowFlags(), Qt::WindowFlags(inputFlags | Qt::FramelessWindowHint)); |
|
2300 |
|
2301 QGraphicsWidget *widget5 = new QGraphicsWidget; |
|
2302 widget5->setWindowFlags(Qt::WindowFlags(inputFlags)); |
|
2303 QCOMPARE(widget5->windowFlags(), Qt::WindowFlags(outputFlags)); |
|
2304 QGraphicsWidget window(0, Qt::Window); |
|
2305 widget5->setParentItem(&window); |
|
2306 QCOMPARE(widget5->windowFlags(), Qt::WindowFlags(outputFlags)); |
|
2307 } |
|
2308 |
|
2309 void tst_QGraphicsWidget::shortcutsDeletion() |
|
2310 { |
|
2311 QGraphicsWidget *widget = new QGraphicsWidget; |
|
2312 QGraphicsWidget *widget2 = new QGraphicsWidget; |
|
2313 widget->setMinimumSize(40, 40); |
|
2314 QWidgetAction *del = new QWidgetAction(widget); |
|
2315 del->setIcon(QIcon("edit-delete")); |
|
2316 del->setShortcut(Qt::Key_Delete); |
|
2317 del->setShortcutContext(Qt::WidgetShortcut); |
|
2318 widget2->addAction(del); |
|
2319 widget2->addAction(del); |
|
2320 delete widget; |
|
2321 } |
|
2322 |
|
2323 class MessUpPainterWidget : public QGraphicsWidget |
|
2324 { |
|
2325 public: |
|
2326 MessUpPainterWidget(QGraphicsItem * parent = 0, Qt::WindowFlags wFlags = 0) |
|
2327 : QGraphicsWidget(parent, wFlags) |
|
2328 {} |
|
2329 |
|
2330 void paintWindowFrame(QPainter * painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
|
2331 { |
|
2332 QCOMPARE(painter->opacity(), 1.0); |
|
2333 painter->setOpacity(0.0); |
|
2334 QGraphicsWidget::paintWindowFrame(painter, option, widget); |
|
2335 } |
|
2336 void paint(QPainter * painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
|
2337 { |
|
2338 QCOMPARE(painter->opacity(), 1.0); |
|
2339 painter->drawRect(0, 0, 100, 100); |
|
2340 QGraphicsWidget::paint(painter, option, widget); |
|
2341 } |
|
2342 |
|
2343 }; |
|
2344 |
|
2345 void tst_QGraphicsWidget::painterStateProtectionOnWindowFrame() |
|
2346 { |
|
2347 MessUpPainterWidget *widget = new MessUpPainterWidget(0, Qt::Window); |
|
2348 QGraphicsScene scene(0, 0, 300, 300); |
|
2349 QGraphicsView view(&scene); |
|
2350 scene.addItem(widget); |
|
2351 view.show(); |
|
2352 QTest::qWaitForWindowShown(&view); |
|
2353 QTest::qWait(500); |
|
2354 } |
|
2355 |
|
2356 class ProxyStyle : public QCommonStyle |
|
2357 { |
|
2358 public: |
|
2359 ProxyStyle(QStyle *proxyStyle) : QCommonStyle() |
|
2360 { |
|
2361 m_proxyStyle = proxyStyle; |
|
2362 } |
|
2363 |
|
2364 int pixelMetric(QStyle::PixelMetric metric, const QStyleOption *option = 0, const QWidget *widget = 0) const |
|
2365 { |
|
2366 return m_proxyStyle->pixelMetric(metric, option, widget); |
|
2367 } |
|
2368 |
|
2369 private: |
|
2370 QStyle *m_proxyStyle; |
|
2371 }; |
|
2372 |
|
2373 class StyledGraphicsWidget : public QGraphicsWidget |
|
2374 { |
|
2375 public: |
|
2376 StyledGraphicsWidget(bool useOwnStyle) : QGraphicsWidget(), m_style(0) { |
|
2377 if (useOwnStyle) { |
|
2378 QStyle *oldStyle = style(); |
|
2379 m_style = new ProxyStyle(oldStyle); |
|
2380 setStyle(m_style); |
|
2381 } |
|
2382 |
|
2383 style()->pixelMetric(QStyle::PM_SmallIconSize); // crash when style() is still in widgetStyles |
|
2384 } |
|
2385 |
|
2386 ~StyledGraphicsWidget() { |
|
2387 delete m_style; |
|
2388 } |
|
2389 |
|
2390 private: |
|
2391 QStyle *m_style; |
|
2392 }; |
|
2393 |
|
2394 void tst_QGraphicsWidget::task243004_setStyleCrash() |
|
2395 { |
|
2396 QGraphicsItem *item1 = new StyledGraphicsWidget(true); |
|
2397 delete item1; // item1 not removed from widgetStyles |
|
2398 |
|
2399 QGraphicsItem *item2 = new StyledGraphicsWidget(false); |
|
2400 delete item2; |
|
2401 } |
|
2402 |
|
2403 class GraphicsWidget_task250119 : public QGraphicsWidget |
|
2404 { |
|
2405 public: |
|
2406 GraphicsWidget_task250119() |
|
2407 : shortcutEvents(0) |
|
2408 { |
|
2409 setFocusPolicy(Qt::StrongFocus); |
|
2410 resize(100, 100); |
|
2411 } |
|
2412 |
|
2413 int shortcutEvents; |
|
2414 |
|
2415 private: |
|
2416 bool event(QEvent *event) |
|
2417 { |
|
2418 if (event->type() == QEvent::Shortcut) |
|
2419 shortcutEvents++; |
|
2420 return QGraphicsWidget::event(event); |
|
2421 } |
|
2422 |
|
2423 void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) |
|
2424 { |
|
2425 if (hasFocus()) { |
|
2426 painter->setPen(QPen(Qt::black, 0, Qt::DashLine)); |
|
2427 painter->drawRect(rect()); |
|
2428 } |
|
2429 painter->setPen(QPen(Qt::black, 0, Qt::SolidLine)); |
|
2430 painter->fillRect(rect().adjusted(2, 2, -2, -2), Qt::yellow); |
|
2431 painter->drawRect(rect().adjusted(2, 2, -2, -2)); |
|
2432 } |
|
2433 }; |
|
2434 |
|
2435 void tst_QGraphicsWidget::task250119_shortcutContext() |
|
2436 { |
|
2437 QGraphicsScene scene; |
|
2438 QGraphicsView view; |
|
2439 view.setScene(&scene); |
|
2440 view.show(); |
|
2441 QApplication::setActiveWindow(&view); |
|
2442 QTest::qWait(25); |
|
2443 QTRY_COMPARE(QApplication::activeWindow(), &view); |
|
2444 |
|
2445 |
|
2446 // *** Event: *** |
|
2447 |
|
2448 GraphicsWidget_task250119 w_event; |
|
2449 scene.addItem(&w_event); |
|
2450 |
|
2451 const int id = w_event.grabShortcut(Qt::Key_A, Qt::WidgetWithChildrenShortcut); |
|
2452 w_event.setShortcutEnabled(id, true); |
|
2453 |
|
2454 w_event.setFocus(); |
|
2455 QTest::keyPress(&view, Qt::Key_A); |
|
2456 QCOMPARE(w_event.shortcutEvents, 1); |
|
2457 |
|
2458 w_event.clearFocus(); |
|
2459 QTest::keyPress(&view, Qt::Key_A); |
|
2460 QCOMPARE(w_event.shortcutEvents, 1); |
|
2461 |
|
2462 scene.removeItem(&w_event); |
|
2463 |
|
2464 |
|
2465 // *** Signal: *** |
|
2466 |
|
2467 GraphicsWidget_task250119 w_signal; |
|
2468 scene.addItem(&w_signal); |
|
2469 |
|
2470 QAction action(0); |
|
2471 action.setShortcut(Qt::Key_B); |
|
2472 action.setShortcutContext(Qt::WidgetWithChildrenShortcut); |
|
2473 QSignalSpy spy(&action, SIGNAL(triggered())); |
|
2474 |
|
2475 w_signal.addAction(&action); |
|
2476 |
|
2477 w_signal.setFocus(); |
|
2478 QTest::keyPress(&view, Qt::Key_B); |
|
2479 QCOMPARE(spy.count(), 1); |
|
2480 |
|
2481 w_signal.clearFocus(); |
|
2482 QTest::keyPress(&view, Qt::Key_B); |
|
2483 QCOMPARE(spy.count(), 1); |
|
2484 |
|
2485 scene.removeItem(&w_signal); |
|
2486 } |
|
2487 |
|
2488 class ClippingAndTransformsScene : public QGraphicsScene |
|
2489 { |
|
2490 public: |
|
2491 QList<QGraphicsItem *> drawnItems; |
|
2492 protected: |
|
2493 void drawItems(QPainter *painter, int numItems, QGraphicsItem *items[], |
|
2494 const QStyleOptionGraphicsItem options[], QWidget *widget = 0) |
|
2495 { |
|
2496 drawnItems.clear(); |
|
2497 for (int i = 0; i < numItems; ++i) |
|
2498 drawnItems << items[i]; |
|
2499 QGraphicsScene::drawItems(painter, numItems, items, options, widget); |
|
2500 } |
|
2501 }; |
|
2502 |
|
2503 class RectWidget : public QGraphicsWidget |
|
2504 { |
|
2505 public: |
|
2506 |
|
2507 RectWidget(Qt::GlobalColor color, QGraphicsItem *parent=0) : QGraphicsWidget(parent), mColor(color) {} |
|
2508 |
|
2509 void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) |
|
2510 { |
|
2511 painter->setBrush(QBrush(mColor)); |
|
2512 painter->drawRect(boundingRect()); |
|
2513 } |
|
2514 |
|
2515 Qt::GlobalColor mColor; |
|
2516 }; |
|
2517 |
|
2518 class RectItem : public QGraphicsItem |
|
2519 { |
|
2520 public: |
|
2521 |
|
2522 RectItem(Qt::GlobalColor color, QGraphicsItem *parent=0) : QGraphicsItem(parent), mColor(color) {} |
|
2523 |
|
2524 QRectF boundingRect() const |
|
2525 {return QRectF(10,10,50,50);} |
|
2526 |
|
2527 void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) |
|
2528 { |
|
2529 painter->setBrush(QBrush(mColor)); |
|
2530 painter->drawRect(boundingRect()); |
|
2531 } |
|
2532 |
|
2533 Qt::GlobalColor mColor; |
|
2534 }; |
|
2535 |
|
2536 void tst_QGraphicsWidget::ensureClipping() |
|
2537 { |
|
2538 ClippingAndTransformsScene scene; |
|
2539 scene.setSceneRect(-50, -50, 200, 200); |
|
2540 |
|
2541 //A root that clip children |
|
2542 RectWidget *clipWidget = new RectWidget(Qt::black); |
|
2543 scene.addItem(clipWidget); |
|
2544 |
|
2545 clipWidget->setFlag(QGraphicsItem::ItemClipsChildrenToShape); |
|
2546 |
|
2547 //a child |
|
2548 RectWidget *childWidget = new RectWidget(Qt::red, clipWidget); |
|
2549 clipWidget->setGeometry(QRectF(10, 10, 100, 100)); |
|
2550 childWidget->setGeometry(QRectF(25, 25, 50, 50)); |
|
2551 |
|
2552 //We put a QGraphicsItem to be sure this one is also paint |
|
2553 RectItem *childitem = new RectItem(Qt::blue, clipWidget); |
|
2554 |
|
2555 QGraphicsView view(&scene); |
|
2556 view.setOptimizationFlag(QGraphicsView::IndirectPainting); |
|
2557 view.show(); |
|
2558 QTest::qWaitForWindowShown(&view); |
|
2559 |
|
2560 QList<QGraphicsItem *> expected; |
|
2561 expected << clipWidget << childWidget << childitem; |
|
2562 QTRY_VERIFY(scene.drawnItems.contains(clipWidget)); |
|
2563 QVERIFY(scene.drawnItems.contains(childWidget)); |
|
2564 QVERIFY(scene.drawnItems.contains(childitem)); |
|
2565 } |
|
2566 |
|
2567 class ItemChangeTester : public QGraphicsWidget |
|
2568 { |
|
2569 public: |
|
2570 ItemChangeTester() |
|
2571 { setFlag(ItemSendsGeometryChanges); clear(); } |
|
2572 ItemChangeTester(QGraphicsItem *parent) : QGraphicsWidget(parent) |
|
2573 { setFlag(ItemSendsGeometryChanges); clear(); } |
|
2574 |
|
2575 void clear() |
|
2576 { |
|
2577 changes.clear(); |
|
2578 values.clear(); |
|
2579 oldValues.clear(); |
|
2580 } |
|
2581 QList<GraphicsItemChange> changes; |
|
2582 QList<QVariant> values; |
|
2583 QList<QVariant> oldValues; |
|
2584 protected: |
|
2585 QVariant itemChange(GraphicsItemChange change, const QVariant &value) |
|
2586 { |
|
2587 changes << change; |
|
2588 values << value; |
|
2589 switch (change) { |
|
2590 case QGraphicsItem::ItemPositionChange: |
|
2591 oldValues << pos(); |
|
2592 break; |
|
2593 case QGraphicsItem::ItemPositionHasChanged: |
|
2594 break; |
|
2595 default: |
|
2596 break; |
|
2597 } |
|
2598 return value; |
|
2599 } |
|
2600 }; |
|
2601 |
|
2602 void tst_QGraphicsWidget::widgetSendsGeometryChanges() |
|
2603 { |
|
2604 ItemChangeTester widget; |
|
2605 widget.setFlags(0); |
|
2606 widget.clear(); |
|
2607 |
|
2608 QPointF pos(10, 10); |
|
2609 widget.setPos(pos); |
|
2610 |
|
2611 QCOMPARE(widget.pos(), pos); |
|
2612 QCOMPARE(widget.changes.size(), 0); |
|
2613 |
|
2614 widget.setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); |
|
2615 QCOMPARE(widget.changes.size(), 2); |
|
2616 |
|
2617 widget.setPos(QPointF()); |
|
2618 QCOMPARE(widget.changes.size(), 4); |
|
2619 |
|
2620 QCOMPARE(widget.pos(), QPointF()); |
|
2621 |
|
2622 QRectF geometry(20, 20, 50, 50); |
|
2623 widget.setGeometry(geometry); |
|
2624 QCOMPARE(widget.changes.size(), 6); |
|
2625 |
|
2626 QCOMPARE(widget.geometry(), geometry); |
|
2627 |
|
2628 QCOMPARE(widget.changes, QList<QGraphicsItem::GraphicsItemChange>() |
|
2629 << QGraphicsItem::ItemFlagsChange |
|
2630 << QGraphicsItem::ItemFlagsHaveChanged |
|
2631 << QGraphicsItem::ItemPositionChange |
|
2632 << QGraphicsItem::ItemPositionHasChanged |
|
2633 << QGraphicsItem::ItemPositionChange |
|
2634 << QGraphicsItem::ItemPositionHasChanged); |
|
2635 } |
|
2636 |
|
2637 class HFWWidget : public QGraphicsWidget |
|
2638 { |
|
2639 public: |
|
2640 HFWWidget() : QGraphicsWidget(0, Qt::Window) |
|
2641 { |
|
2642 QSizePolicy sp; |
|
2643 sp.setHeightForWidth(true); |
|
2644 setSizePolicy(sp); |
|
2645 } |
|
2646 |
|
2647 void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) |
|
2648 { |
|
2649 Q_UNUSED(option); |
|
2650 Q_UNUSED(widget); |
|
2651 qreal w = rect().width(); |
|
2652 QRectF box(0, 0, w, 2400/w); |
|
2653 painter->drawRoundRect(box); |
|
2654 painter->drawLine(box.topLeft(), box.bottomRight()); |
|
2655 painter->drawLine(box.bottomLeft(), box.topRight()); |
|
2656 } |
|
2657 |
|
2658 protected: |
|
2659 QSizeF sizeHint(Qt::SizeHint which, const QSizeF &constraint = QSizeF()) const |
|
2660 { |
|
2661 qreal w = constraint.width(); |
|
2662 switch (which) { |
|
2663 case Qt::MinimumSize: |
|
2664 if (w >= 0 && constraint.height() < 0) { |
|
2665 // keep the same area of 60x40 = 2400 |
|
2666 return QSizeF(w, 2400.0/w); |
|
2667 } else { |
|
2668 return QSizeF(10, 10); |
|
2669 } |
|
2670 break; |
|
2671 case Qt::PreferredSize: |
|
2672 return QSizeF(48.989794, 48.989794); |
|
2673 default: |
|
2674 break; |
|
2675 } |
|
2676 return QGraphicsWidget::sizeHint(which, constraint); |
|
2677 } |
|
2678 }; |
|
2679 |
|
2680 void tst_QGraphicsWidget::respectHFW() |
|
2681 { |
|
2682 #if defined(Q_OS_WINCE) || defined(Q_OS_MAC) || defined(Q_WS_QWS) |
|
2683 qDebug("This test is platform dependent, it fails on wince, mac and qws. Please fix."); |
|
2684 #else |
|
2685 QGraphicsScene scene; |
|
2686 HFWWidget *window = new HFWWidget; |
|
2687 scene.addItem(window); |
|
2688 QGraphicsView *view = new QGraphicsView(&scene); |
|
2689 view->resize(400, 400); |
|
2690 view->setSceneRect(-100, -100, 300,300); |
|
2691 |
|
2692 view->show(); |
|
2693 window->setGeometry(0, 0, 70, 70); |
|
2694 QTest::qWaitForWindowShown(view); |
|
2695 |
|
2696 { // here we go - simulate a interactive resize of the window |
|
2697 QTest::qWait(100); |
|
2698 QTest::mouseMove(view, view->mapFromScene(71, 71)); // bottom right corner |
|
2699 QTest::qWait(100); |
|
2700 |
|
2701 QTest::mousePress(view->viewport(), Qt::LeftButton, 0, view->mapFromScene(71, 71), 200); |
|
2702 view->grabMouse(); |
|
2703 // move both mouse cursor and set correct event in order to emulate resize |
|
2704 QTest::mouseMove(view->viewport(), view->mapFromScene(60, 30), 200); |
|
2705 QMouseEvent e = QMouseEvent(QEvent::MouseMove, |
|
2706 view->mapFromScene(60, 20), |
|
2707 Qt::NoButton, |
|
2708 Qt::LeftButton, |
|
2709 Qt::NoModifier); |
|
2710 QApplication::sendEvent(view->viewport(), &e); |
|
2711 view->releaseMouse(); |
|
2712 } |
|
2713 QTest::qWait(100); |
|
2714 const QSizeF winSize = window->size(); |
|
2715 qreal minHFW = window->effectiveSizeHint(Qt::MinimumSize, QSizeF(winSize.width(), -1)).height(); |
|
2716 QVERIFY(qAbs(minHFW - winSize.height()) < 1); |
|
2717 #endif |
|
2718 } |
|
2719 |
|
2720 class PolishWidget : public QGraphicsWidget |
|
2721 { |
|
2722 public: |
|
2723 |
|
2724 PolishWidget(Qt::GlobalColor color, QGraphicsItem *parent=0) : |
|
2725 QGraphicsWidget(parent), mColor(color) |
|
2726 { |
|
2727 } |
|
2728 |
|
2729 void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *) |
|
2730 { |
|
2731 painter->setBrush(QBrush(mColor)); |
|
2732 painter->drawRect(boundingRect()); |
|
2733 } |
|
2734 |
|
2735 void polishEvent() |
|
2736 { |
|
2737 if (!parentWidget()) { |
|
2738 //We add a child in the polish event for the parent |
|
2739 PolishWidget *childWidget = new PolishWidget(Qt::black, this); |
|
2740 childWidget->setGeometry(QRectF(10,10,30,30)); |
|
2741 } |
|
2742 |
|
2743 QGraphicsWidget::polishEvent(); |
|
2744 mColor = Qt::red; |
|
2745 update(); |
|
2746 numberOfPolish++; |
|
2747 } |
|
2748 |
|
2749 static int numberOfPolish; |
|
2750 |
|
2751 private: |
|
2752 Qt::GlobalColor mColor; |
|
2753 }; |
|
2754 |
|
2755 int PolishWidget::numberOfPolish = 0; |
|
2756 |
|
2757 void tst_QGraphicsWidget::addChildInpolishEvent() |
|
2758 { |
|
2759 QGraphicsScene scene; |
|
2760 |
|
2761 PolishWidget *parentWidget = new PolishWidget(Qt::white); |
|
2762 scene.addItem(parentWidget); |
|
2763 |
|
2764 QGraphicsView view(&scene); |
|
2765 view.resize(200, 200); |
|
2766 view.show(); |
|
2767 QTest::qWaitForWindowShown(&view); |
|
2768 QCOMPARE(PolishWidget::numberOfPolish, 2); |
|
2769 } |
|
2770 |
|
2771 |
|
2772 QTEST_MAIN(tst_QGraphicsWidget) |
|
2773 #include "tst_qgraphicswidget.moc" |
|
2774 |
|
2775 #else // QT_NO_STYLE_CLEANLOOKS |
|
2776 QTEST_NOOP_MAIN |
|
2777 #endif |
|
2778 |