1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/
6 ** This file is part of the test suite of the Qt Toolkit.
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** GNU Lesser General Public License Usage
10 ** This file may be used under the terms of the GNU Lesser General Public
11 ** License version 2.1 as published by the Free Software Foundation and
12 ** appearing in the file LICENSE.LGPL included in the packaging of this
13 ** file. Please review the following information to ensure the GNU Lesser
14 ** General Public License version 2.1 requirements will be met:
15 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
17 ** In addition, as a special exception, Nokia gives you certain additional
18 ** rights. These rights are described in the Nokia Qt LGPL Exception
19 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
21 ** GNU General Public License Usage
22 ** Alternatively, this file may be used under the terms of the GNU General
23 ** Public License version 3.0 as published by the Free Software Foundation
24 ** and appearing in the file LICENSE.GPL included in the packaging of this
25 ** file. Please review the following information to ensure the GNU General
26 ** Public License version 3.0 requirements will be met:
27 ** http://www.gnu.org/copyleft/gpl.html.
30 ** Alternatively, this file may be used in accordance with the terms and
31 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
44 #include <QtQuick/qquickitem.h>
45 #include <QtQuick/qquickcanvas.h>
46 #include <QtQuick/qquickview.h>
47 #include <QtWidgets/QGraphicsSceneMouseEvent>
48 #include "private/qquickfocusscope_p.h"
49 #include "private/qquickitem_p.h"
52 #include "../../shared/util.h"
54 class TestItem : public QQuickItem
58 TestItem(QQuickItem *parent = 0)
59 : QQuickItem(parent), focused(false), pressCount(0), releaseCount(0)
60 , wheelCount(0), acceptIncomingTouchEvents(true)
61 , touchEventReached(false) {}
67 bool acceptIncomingTouchEvents;
68 bool touchEventReached;
70 virtual void focusInEvent(QFocusEvent *) { Q_ASSERT(!focused); focused = true; }
71 virtual void focusOutEvent(QFocusEvent *) { Q_ASSERT(focused); focused = false; }
72 virtual void mousePressEvent(QMouseEvent *event) { event->accept(); ++pressCount; }
73 virtual void mouseReleaseEvent(QMouseEvent *event) { event->accept(); ++releaseCount; }
74 virtual void touchEvent(QTouchEvent *event) {
75 touchEventReached = true;
76 event->setAccepted(acceptIncomingTouchEvents);
78 virtual void wheelEvent(QWheelEvent *event) { event->accept(); ++wheelCount; }
81 class TestCanvas: public QQuickCanvas
88 virtual bool event(QEvent *event)
90 return QQuickCanvas::event(event);
94 class TestPolishItem : public QQuickItem
98 TestPolishItem(QQuickItem *parent = 0)
99 : QQuickItem(parent), wasPolished(false) {
106 virtual void updatePolish() {
116 class TestFocusScope : public QQuickFocusScope
120 TestFocusScope(QQuickItem *parent = 0) : QQuickFocusScope(parent), focused(false) {}
124 virtual void focusInEvent(QFocusEvent *) { Q_ASSERT(!focused); focused = true; }
125 virtual void focusOutEvent(QFocusEvent *) { Q_ASSERT(focused); focused = false; }
128 class tst_qquickitem : public QQmlDataTest
139 void addedToCanvas();
141 void multipleFocusClears();
142 void focusSubItemInNonFocusScope();
143 void parentItemWithFocus();
144 void reparentFocusedItem();
147 void setParentItem();
154 void touchEventAcceptIgnore_data();
155 void touchEventAcceptIgnore();
156 void polishOutsideAnimation();
157 void polishOnCompleted();
159 void wheelEvent_data();
161 void hoverEvent_data();
163 void hoverEventInParent();
165 void paintOrder_data();
171 NoOp, Append, Remove, StackBefore, StackAfter, SetZ
174 void ensureFocus(QWindow *w) {
176 w->requestActivateWindow();
177 qApp->processEvents();
181 void tst_qquickitem::initTestCase()
183 QQmlDataTest::initTestCase();
184 qmlRegisterType<TestPolishItem>("Qt.test", 1, 0, "TestPolishItem");
187 // Focus still updates when outside a canvas
188 void tst_qquickitem::noCanvas()
190 QQuickItem *root = new TestItem;
191 QQuickItem *child = new TestItem(root);
192 QQuickItem *scope = new TestItem(root);
193 QQuickFocusScope *scopedChild = new TestFocusScope(scope);
194 QQuickFocusScope *scopedChild2 = new TestFocusScope(scope);
196 QCOMPARE(root->hasFocus(), false);
197 QCOMPARE(child->hasFocus(), false);
198 QCOMPARE(scope->hasFocus(), false);
199 QCOMPARE(scopedChild->hasFocus(), false);
200 QCOMPARE(scopedChild2->hasFocus(), false);
202 root->setFocus(true);
203 scope->setFocus(true);
204 scopedChild2->setFocus(true);
205 QCOMPARE(root->hasFocus(), true);
206 QCOMPARE(child->hasFocus(), false);
207 QCOMPARE(scope->hasFocus(), false);
208 QCOMPARE(scopedChild->hasFocus(), false);
209 QCOMPARE(scopedChild2->hasFocus(), true);
211 root->setFocus(false);
212 child->setFocus(true);
213 scopedChild->setFocus(true);
214 scope->setFocus(false);
215 QCOMPARE(root->hasFocus(), false);
216 QCOMPARE(child->hasFocus(), false);
217 QCOMPARE(scope->hasFocus(), false);
218 QCOMPARE(scopedChild->hasFocus(), true);
219 QCOMPARE(scopedChild2->hasFocus(), false);
225 FocusData() : focus(false), activeFocus(false) {}
227 void set(bool f, bool af) { focus = f; activeFocus = af; }
231 struct FocusState : public QHash<QQuickItem *, FocusData>
233 FocusState() : activeFocusItem(0) {}
234 FocusState &operator<<(QQuickItem *item) {
235 insert(item, FocusData());
239 void active(QQuickItem *i) {
242 QQuickItem *activeFocusItem;
247 if (focusState.activeFocusItem) { \
248 QCOMPARE(canvas.activeFocusItem(), focusState.activeFocusItem); \
249 if (qobject_cast<TestItem *>(canvas.activeFocusItem())) \
250 QCOMPARE(qobject_cast<TestItem *>(canvas.activeFocusItem())->focused, true); \
251 else if (qobject_cast<TestFocusScope *>(canvas.activeFocusItem())) \
252 QCOMPARE(qobject_cast<TestFocusScope *>(canvas.activeFocusItem())->focused, true); \
254 QCOMPARE(canvas.activeFocusItem(), canvas.rootItem()); \
256 for (QHash<QQuickItem *, FocusData>::Iterator iter = focusState.begin(); \
257 iter != focusState.end(); \
259 QCOMPARE(iter.key()->hasFocus(), iter.value().focus); \
260 QCOMPARE(iter.key()->hasActiveFocus(), iter.value().activeFocus); \
264 // Tests a simple set of top-level scoped items
265 void tst_qquickitem::simpleFocus()
268 ensureFocus(&canvas);
271 QSKIP("QTBUG-24094: fails on Mac OS X 10.7");
274 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
276 QQuickItem *l1c1 = new TestItem(canvas.rootItem());
277 QQuickItem *l1c2 = new TestItem(canvas.rootItem());
278 QQuickItem *l1c3 = new TestItem(canvas.rootItem());
280 QQuickItem *l2c1 = new TestItem(l1c1);
281 QQuickItem *l2c2 = new TestItem(l1c1);
282 QQuickItem *l2c3 = new TestItem(l1c3);
284 FocusState focusState;
285 focusState << l1c1 << l1c2 << l1c3
286 << l2c1 << l2c2 << l2c3;
289 l1c1->setFocus(true);
290 focusState[l1c1].set(true, true);
291 focusState.active(l1c1);
294 l2c3->setFocus(true);
295 focusState[l1c1].set(false, false);
296 focusState[l2c3].set(true, true);
297 focusState.active(l2c3);
300 l1c3->setFocus(true);
301 focusState[l2c3].set(false, false);
302 focusState[l1c3].set(true, true);
303 focusState.active(l1c3);
306 l1c2->setFocus(false);
309 l1c3->setFocus(false);
310 focusState[l1c3].set(false, false);
311 focusState.active(0);
314 l2c1->setFocus(true);
315 focusState[l2c1].set(true, true);
316 focusState.active(l2c1);
320 // Items with a focus scope
321 void tst_qquickitem::scopedFocus()
324 ensureFocus(&canvas);
325 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
327 QQuickItem *l1c1 = new TestItem(canvas.rootItem());
328 QQuickItem *l1c2 = new TestItem(canvas.rootItem());
329 QQuickItem *l1c3 = new TestItem(canvas.rootItem());
331 QQuickItem *l2c1 = new TestItem(l1c1);
332 QQuickItem *l2c2 = new TestItem(l1c1);
333 QQuickItem *l2c3 = new TestFocusScope(l1c3);
335 QQuickItem *l3c1 = new TestItem(l2c3);
336 QQuickItem *l3c2 = new TestFocusScope(l2c3);
338 QQuickItem *l4c1 = new TestItem(l3c2);
339 QQuickItem *l4c2 = new TestItem(l3c2);
341 FocusState focusState;
342 focusState << l1c1 << l1c2 << l1c3
343 << l2c1 << l2c2 << l2c3
348 l4c2->setFocus(true);
349 focusState[l4c2].set(true, false);
352 l4c1->setFocus(true);
353 focusState[l4c2].set(false, false);
354 focusState[l4c1].set(true, false);
357 l1c1->setFocus(true);
358 focusState[l1c1].set(true, true);
359 focusState.active(l1c1);
362 l3c2->setFocus(true);
363 focusState[l3c2].set(true, false);
366 l2c3->setFocus(true);
367 focusState[l1c1].set(false, false);
368 focusState[l2c3].set(true, true);
369 focusState[l3c2].set(true, true);
370 focusState[l4c1].set(true, true);
371 focusState.active(l4c1);
374 l3c2->setFocus(false);
375 focusState[l3c2].set(false, false);
376 focusState[l4c1].set(true, false);
377 focusState.active(l2c3);
380 l3c2->setFocus(true);
381 focusState[l3c2].set(true, true);
382 focusState[l4c1].set(true, true);
383 focusState.active(l4c1);
386 l4c1->setFocus(false);
387 focusState[l4c1].set(false, false);
388 focusState.active(l3c2);
391 l1c3->setFocus(true);
392 focusState[l1c3].set(true, true);
393 focusState[l2c3].set(false, false);
394 focusState[l3c2].set(true, false);
395 focusState.active(l1c3);
399 // Tests focus corrects itself when a tree is added to a canvas for the first time
400 void tst_qquickitem::addedToCanvas()
404 ensureFocus(&canvas);
405 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
407 QQuickItem *item = new TestItem;
409 FocusState focusState;
412 item->setFocus(true);
413 focusState[item].set(true, false);
416 item->setParentItem(canvas.rootItem());
417 focusState[item].set(true, true);
418 focusState.active(item);
424 ensureFocus(&canvas);
425 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
427 QQuickItem *item = new TestItem(canvas.rootItem());
429 QQuickItem *tree = new TestItem;
430 QQuickItem *c1 = new TestItem(tree);
431 QQuickItem *c2 = new TestItem(tree);
433 FocusState focusState;
434 focusState << item << tree << c1 << c2;
436 item->setFocus(true);
439 focusState[item].set(true, true);
440 focusState[c1].set(false, false);
441 focusState[c2].set(true, false);
442 focusState.active(item);
445 tree->setParentItem(item);
446 focusState[c1].set(false, false);
447 focusState[c2].set(false, false);
453 ensureFocus(&canvas);
454 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
456 QQuickItem *tree = new TestItem;
457 QQuickItem *c1 = new TestItem(tree);
458 QQuickItem *c2 = new TestItem(tree);
460 FocusState focusState;
461 focusState << tree << c1 << c2;
464 focusState[c1].set(false, false);
465 focusState[c2].set(true, false);
468 tree->setParentItem(canvas.rootItem());
469 focusState[c1].set(false, false);
470 focusState[c2].set(true, true);
471 focusState.active(c2);
477 ensureFocus(&canvas);
478 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
479 QQuickItem *tree = new TestFocusScope;
480 QQuickItem *c1 = new TestItem(tree);
481 QQuickItem *c2 = new TestItem(tree);
483 FocusState focusState;
484 focusState << tree << c1 << c2;
487 focusState[c1].set(false, false);
488 focusState[c2].set(true, false);
491 tree->setParentItem(canvas.rootItem());
492 focusState[c1].set(false, false);
493 focusState[c2].set(true, false);
496 tree->setFocus(true);
497 focusState[tree].set(true, true);
498 focusState[c2].set(true, true);
499 focusState.active(c2);
505 ensureFocus(&canvas);
506 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
507 QQuickItem *tree = new TestFocusScope;
508 QQuickItem *c1 = new TestItem(tree);
509 QQuickItem *c2 = new TestItem(tree);
511 FocusState focusState;
512 focusState << tree << c1 << c2;
513 tree->setFocus(true);
516 focusState[tree].set(true, false);
517 focusState[c1].set(false, false);
518 focusState[c2].set(true, false);
521 tree->setParentItem(canvas.rootItem());
522 focusState[tree].set(true, true);
523 focusState[c1].set(false, false);
524 focusState[c2].set(true, true);
525 focusState.active(c2);
531 ensureFocus(&canvas);
532 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
533 QQuickItem *child = new TestItem(canvas.rootItem());
534 QQuickItem *tree = new TestFocusScope;
535 QQuickItem *c1 = new TestItem(tree);
536 QQuickItem *c2 = new TestItem(tree);
538 FocusState focusState;
539 focusState << child << tree << c1 << c2;
540 child->setFocus(true);
541 tree->setFocus(true);
544 focusState[child].set(true, true);
545 focusState[tree].set(true, false);
546 focusState[c1].set(false, false);
547 focusState[c2].set(true, false);
548 focusState.active(child);
551 tree->setParentItem(canvas.rootItem());
552 focusState[tree].set(false, false);
553 focusState[c1].set(false, false);
554 focusState[c2].set(true, false);
557 tree->setFocus(true);
558 focusState[child].set(false, false);
559 focusState[tree].set(true, true);
560 focusState[c2].set(true, true);
561 focusState.active(c2);
566 void tst_qquickitem::changeParent()
568 // Parent to no parent
571 ensureFocus(&canvas);
572 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
573 QQuickItem *child = new TestItem(canvas.rootItem());
575 FocusState focusState;
579 child->setFocus(true);
580 focusState[child].set(true, true);
581 focusState.active(child);
584 child->setParentItem(0);
585 focusState[child].set(true, false);
586 focusState.active(0);
590 // Different parent, same focus scope
593 ensureFocus(&canvas);
594 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
595 QQuickItem *child = new TestItem(canvas.rootItem());
596 QQuickItem *child2 = new TestItem(canvas.rootItem());
598 FocusState focusState;
599 focusState << child << child2;
602 child->setFocus(true);
603 focusState[child].set(true, true);
604 focusState.active(child);
607 child->setParentItem(child2);
611 // Different parent, different focus scope
614 ensureFocus(&canvas);
615 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
616 QQuickItem *child = new TestItem(canvas.rootItem());
617 QQuickItem *child2 = new TestFocusScope(canvas.rootItem());
618 QQuickItem *item = new TestItem(child);
620 FocusState focusState;
621 focusState << child << child2 << item;
624 item->setFocus(true);
625 focusState[item].set(true, true);
626 focusState.active(item);
629 item->setParentItem(child2);
630 focusState[item].set(true, false);
631 focusState.active(0);
636 ensureFocus(&canvas);
637 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
638 QQuickItem *child = new TestItem(canvas.rootItem());
639 QQuickItem *child2 = new TestFocusScope(canvas.rootItem());
640 QQuickItem *item = new TestItem(child2);
642 FocusState focusState;
643 focusState << child << child2 << item;
646 item->setFocus(true);
647 focusState[item].set(true, false);
648 focusState.active(0);
651 item->setParentItem(child);
652 focusState[item].set(true, true);
653 focusState.active(item);
658 ensureFocus(&canvas);
659 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
660 QQuickItem *child = new TestItem(canvas.rootItem());
661 QQuickItem *child2 = new TestFocusScope(canvas.rootItem());
662 QQuickItem *item = new TestItem(child2);
664 FocusState focusState;
665 focusState << child << child2 << item;
668 child->setFocus(true);
669 item->setFocus(true);
670 focusState[child].set(true, true);
671 focusState[item].set(true, false);
672 focusState.active(child);
675 item->setParentItem(child);
676 focusState[item].set(false, false);
680 // child has active focus, then its fs parent changes parent to 0, then
681 // child is deleted, then its parent changes again to a valid parent
684 ensureFocus(&canvas);
685 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
686 QQuickItem *item = new TestFocusScope(canvas.rootItem());
687 QQuickItem *child = new TestItem(item);
688 QQuickItem *child2 = new TestItem;
690 FocusState focusState;
691 focusState << item << child;
694 item->setFocus(true);
695 child->setFocus(true);
696 focusState[child].set(true, true);
697 focusState[item].set(true, true);
698 focusState.active(child);
701 item->setParentItem(0);
702 focusState[child].set(true, false);
703 focusState[item].set(true, false);
704 focusState.active(0);
707 focusState.remove(child);
709 item->setParentItem(canvas.rootItem());
710 focusState[item].set(true, true);
711 focusState.active(item);
717 void tst_qquickitem::multipleFocusClears()
719 //Multiple clears of focus inside a focus scope shouldn't crash. QTBUG-24714
720 QQuickView *view = new QQuickView;
721 view->setSource(testFileUrl("multipleFocusClears.qml"));
724 QTRY_VERIFY(QGuiApplication::focusWindow() == view);
727 void tst_qquickitem::focusSubItemInNonFocusScope()
729 QQuickView *view = new QQuickView;
730 view->setSource(testFileUrl("focusSubItemInNonFocusScope.qml"));
732 qApp->processEvents();
734 QQuickItem *dummyItem = view->rootObject()->findChild<QQuickItem *>("dummyItem");
737 QQuickItem *textInput = view->rootObject()->findChild<QQuickItem *>("textInput");
740 QVERIFY(dummyItem->hasFocus());
741 QVERIFY(!textInput->hasFocus());
742 QVERIFY(dummyItem->hasActiveFocus());
744 QVERIFY(QMetaObject::invokeMethod(textInput, "forceActiveFocus"));
746 QVERIFY(!dummyItem->hasFocus());
747 QVERIFY(textInput->hasFocus());
748 QVERIFY(textInput->hasActiveFocus());
753 void tst_qquickitem::parentItemWithFocus()
756 ensureFocus(&canvas);
757 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
762 FocusState focusState;
763 focusState << &parent << &child;
766 parent.setFocus(true);
767 child.setFocus(true);
768 focusState[&parent].set(true, false);
769 focusState[&child].set(true, false);
772 child.setParentItem(&parent);
773 focusState[&parent].set(true, false);
774 focusState[&child].set(false, false);
777 parent.setParentItem(canvas.rootItem());
778 focusState[&parent].set(true, true);
779 focusState[&child].set(false, false);
780 focusState.active(&parent);
783 child.forceActiveFocus();
784 focusState[&parent].set(false, false);
785 focusState[&child].set(true, true);
786 focusState.active(&child);
791 QQuickItem grandchild(&child);
793 FocusState focusState;
794 focusState << &parent << &child << &grandchild;
797 parent.setFocus(true);
798 grandchild.setFocus(true);
799 focusState[&parent].set(true, false);
800 focusState[&child].set(false, false);
801 focusState[&grandchild].set(true, false);
804 child.setParentItem(&parent);
805 focusState[&parent].set(true, false);
806 focusState[&child].set(false, false);
807 focusState[&grandchild].set(false, false);
810 parent.setParentItem(canvas.rootItem());
811 focusState[&parent].set(true, true);
812 focusState[&child].set(false, false);
813 focusState[&grandchild].set(false, false);
814 focusState.active(&parent);
817 grandchild.forceActiveFocus();
818 focusState[&parent].set(false, false);
819 focusState[&child].set(false, false);
820 focusState[&grandchild].set(true, true);
821 focusState.active(&grandchild);
826 void tst_qquickitem::reparentFocusedItem()
829 ensureFocus(&canvas);
830 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
832 QQuickItem parent(canvas.rootItem());
833 QQuickItem child(&parent);
834 QQuickItem sibling(&parent);
835 QQuickItem grandchild(&child);
837 FocusState focusState;
838 focusState << &parent << &child << &sibling << &grandchild;
841 grandchild.setFocus(true);
842 focusState[&parent].set(false, false);
843 focusState[&child].set(false, false);
844 focusState[&sibling].set(false, false);
845 focusState[&grandchild].set(true, true);
846 focusState.active(&grandchild);
849 // Parenting the item to another item within the same focus scope shouldn't change it's focus.
850 child.setParentItem(&sibling);
854 void tst_qquickitem::constructor()
856 QQuickItem *root = new QQuickItem;
857 QVERIFY(root->parent() == 0);
858 QVERIFY(root->parentItem() == 0);
860 QQuickItem *child1 = new QQuickItem(root);
861 QVERIFY(child1->parent() == root);
862 QVERIFY(child1->parentItem() == root);
863 QCOMPARE(root->childItems().count(), 1);
864 QCOMPARE(root->childItems().at(0), child1);
866 QQuickItem *child2 = new QQuickItem(root);
867 QVERIFY(child2->parent() == root);
868 QVERIFY(child2->parentItem() == root);
869 QCOMPARE(root->childItems().count(), 2);
870 QCOMPARE(root->childItems().at(0), child1);
871 QCOMPARE(root->childItems().at(1), child2);
876 void tst_qquickitem::setParentItem()
878 QQuickItem *root = new QQuickItem;
879 QVERIFY(root->parent() == 0);
880 QVERIFY(root->parentItem() == 0);
882 QQuickItem *child1 = new QQuickItem;
883 QVERIFY(child1->parent() == 0);
884 QVERIFY(child1->parentItem() == 0);
886 child1->setParentItem(root);
887 QVERIFY(child1->parent() == 0);
888 QVERIFY(child1->parentItem() == root);
889 QCOMPARE(root->childItems().count(), 1);
890 QCOMPARE(root->childItems().at(0), child1);
892 QQuickItem *child2 = new QQuickItem;
893 QVERIFY(child2->parent() == 0);
894 QVERIFY(child2->parentItem() == 0);
895 child2->setParentItem(root);
896 QVERIFY(child2->parent() == 0);
897 QVERIFY(child2->parentItem() == root);
898 QCOMPARE(root->childItems().count(), 2);
899 QCOMPARE(root->childItems().at(0), child1);
900 QCOMPARE(root->childItems().at(1), child2);
902 child1->setParentItem(0);
903 QVERIFY(child1->parent() == 0);
904 QVERIFY(child1->parentItem() == 0);
905 QCOMPARE(root->childItems().count(), 1);
906 QCOMPARE(root->childItems().at(0), child2);
910 QVERIFY(child1->parent() == 0);
911 QVERIFY(child1->parentItem() == 0);
912 QVERIFY(child2->parent() == 0);
913 QVERIFY(child2->parentItem() == 0);
919 void tst_qquickitem::visible()
921 QQuickItem *root = new QQuickItem;
923 QQuickItem *child1 = new QQuickItem;
924 child1->setParentItem(root);
926 QQuickItem *child2 = new QQuickItem;
927 child2->setParentItem(root);
929 QVERIFY(child1->isVisible());
930 QVERIFY(child2->isVisible());
932 root->setVisible(false);
933 QVERIFY(!child1->isVisible());
934 QVERIFY(!child2->isVisible());
936 root->setVisible(true);
937 QVERIFY(child1->isVisible());
938 QVERIFY(child2->isVisible());
940 child1->setVisible(false);
941 QVERIFY(!child1->isVisible());
942 QVERIFY(child2->isVisible());
944 child2->setParentItem(child1);
945 QVERIFY(!child1->isVisible());
946 QVERIFY(!child2->isVisible());
948 child2->setParentItem(root);
949 QVERIFY(!child1->isVisible());
950 QVERIFY(child2->isVisible());
957 void tst_qquickitem::enabled()
959 QQuickItem *root = new QQuickItem;
961 QQuickItem *child1 = new QQuickItem;
962 child1->setParentItem(root);
964 QQuickItem *child2 = new QQuickItem;
965 child2->setParentItem(root);
967 QVERIFY(child1->isEnabled());
968 QVERIFY(child2->isEnabled());
970 root->setEnabled(false);
971 QVERIFY(!child1->isEnabled());
972 QVERIFY(!child2->isEnabled());
974 root->setEnabled(true);
975 QVERIFY(child1->isEnabled());
976 QVERIFY(child2->isEnabled());
978 child1->setEnabled(false);
979 QVERIFY(!child1->isEnabled());
980 QVERIFY(child2->isEnabled());
982 child2->setParentItem(child1);
983 QVERIFY(!child1->isEnabled());
984 QVERIFY(!child2->isEnabled());
986 child2->setParentItem(root);
987 QVERIFY(!child1->isEnabled());
988 QVERIFY(child2->isEnabled());
995 void tst_qquickitem::enabledFocus()
998 ensureFocus(&canvas);
1000 QQuickFocusScope root;
1002 root.setFocus(true);
1003 root.setEnabled(false);
1005 QCOMPARE(root.isEnabled(), false);
1006 QCOMPARE(root.hasFocus(), true);
1007 QCOMPARE(root.hasActiveFocus(), false);
1009 root.setParentItem(canvas.rootItem());
1011 QCOMPARE(root.isEnabled(), false);
1012 QCOMPARE(root.hasFocus(), true);
1013 QCOMPARE(root.hasActiveFocus(), false);
1014 QCOMPARE(canvas.activeFocusItem(), canvas.rootItem());
1016 root.setEnabled(true);
1017 QCOMPARE(root.isEnabled(), true);
1018 QCOMPARE(root.hasFocus(), true);
1019 QCOMPARE(root.hasActiveFocus(), true);
1020 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&root));
1023 child1.setParentItem(&root);
1025 QCOMPARE(child1.isEnabled(), true);
1026 QCOMPARE(child1.hasFocus(), false);
1027 QCOMPARE(child1.hasActiveFocus(), false);
1028 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&root));
1031 child2.setFocus(true);
1032 child2.setParentItem(&root);
1034 QCOMPARE(root.isEnabled(), true);
1035 QCOMPARE(root.hasFocus(), true);
1036 QCOMPARE(root.hasActiveFocus(), true);
1037 QCOMPARE(child2.isEnabled(), true);
1038 QCOMPARE(child2.hasFocus(), true);
1039 QCOMPARE(child2.hasActiveFocus(), true);
1040 QCOMPARE(canvas.activeFocusItem(), &child2);
1042 child2.setEnabled(false);
1044 QCOMPARE(root.isEnabled(), true);
1045 QCOMPARE(root.hasFocus(), true);
1046 QCOMPARE(root.hasActiveFocus(), true);
1047 QCOMPARE(child1.isEnabled(), true);
1048 QCOMPARE(child1.hasFocus(), false);
1049 QCOMPARE(child1.hasActiveFocus(), false);
1050 QCOMPARE(child2.isEnabled(), false);
1051 QCOMPARE(child2.hasFocus(), true);
1052 QCOMPARE(child2.hasActiveFocus(), false);
1053 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&root));
1055 child1.setEnabled(false);
1056 QCOMPARE(child1.isEnabled(), false);
1057 QCOMPARE(child1.hasFocus(), false);
1058 QCOMPARE(child1.hasActiveFocus(), false);
1060 child1.setFocus(true);
1061 QCOMPARE(child1.isEnabled(), false);
1062 QCOMPARE(child1.hasFocus(), true);
1063 QCOMPARE(child1.hasActiveFocus(), false);
1064 QCOMPARE(child2.isEnabled(), false);
1065 QCOMPARE(child2.hasFocus(), false);
1066 QCOMPARE(child2.hasActiveFocus(), false);
1067 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&root));
1069 child1.setEnabled(true);
1070 QCOMPARE(child1.isEnabled(), true);
1071 QCOMPARE(child1.hasFocus(), true);
1072 QCOMPARE(child1.hasActiveFocus(), true);
1073 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&child1));
1075 root.setFocus(false);
1076 QCOMPARE(root.isEnabled(), true);
1077 QCOMPARE(root.hasFocus(), false);
1078 QCOMPARE(root.hasActiveFocus(), false);
1079 QCOMPARE(child1.isEnabled(), true);
1080 QCOMPARE(child1.hasFocus(), true);
1081 QCOMPARE(child1.hasActiveFocus(), false);
1082 QCOMPARE(canvas.activeFocusItem(), canvas.rootItem());
1084 child2.forceActiveFocus();
1085 QCOMPARE(root.isEnabled(), true);
1086 QCOMPARE(root.hasFocus(), true);
1087 QCOMPARE(root.hasActiveFocus(), true);
1088 QCOMPARE(child1.isEnabled(), true);
1089 QCOMPARE(child1.hasFocus(), false);
1090 QCOMPARE(child1.hasActiveFocus(), false);
1091 QCOMPARE(child2.isEnabled(), false);
1092 QCOMPARE(child2.hasFocus(), true);
1093 QCOMPARE(child2.hasActiveFocus(), false);
1094 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&root));
1096 root.setEnabled(false);
1097 QCOMPARE(root.isEnabled(), false);
1098 QCOMPARE(root.hasFocus(), true);
1099 QCOMPARE(root.hasActiveFocus(), false);
1100 QCOMPARE(child1.isEnabled(), false);
1101 QCOMPARE(child1.hasFocus(), false);
1102 QCOMPARE(child1.hasActiveFocus(), false);
1103 QCOMPARE(child2.isEnabled(), false);
1104 QCOMPARE(child2.hasFocus(), true);
1105 QCOMPARE(child2.hasActiveFocus(), false);
1106 QCOMPARE(canvas.activeFocusItem(), canvas.rootItem());
1108 child1.forceActiveFocus();
1109 QCOMPARE(root.isEnabled(), false);
1110 QCOMPARE(root.hasFocus(), true);
1111 QCOMPARE(root.hasActiveFocus(), false);
1112 QCOMPARE(child1.isEnabled(), false);
1113 QCOMPARE(child1.hasFocus(), true);
1114 QCOMPARE(child1.hasActiveFocus(), false);
1115 QCOMPARE(child2.isEnabled(), false);
1116 QCOMPARE(child2.hasFocus(), false);
1117 QCOMPARE(child2.hasActiveFocus(), false);
1118 QCOMPARE(canvas.activeFocusItem(), canvas.rootItem());
1120 root.setEnabled(true);
1121 QCOMPARE(root.isEnabled(), true);
1122 QCOMPARE(root.hasFocus(), true);
1123 QCOMPARE(root.hasActiveFocus(), true);
1124 QCOMPARE(child1.isEnabled(), true);
1125 QCOMPARE(child1.hasFocus(), true);
1126 QCOMPARE(child1.hasActiveFocus(), true);
1127 QCOMPARE(child2.isEnabled(), false);
1128 QCOMPARE(child2.hasFocus(), false);
1129 QCOMPARE(child2.hasActiveFocus(), false);
1130 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&child1));
1133 void tst_qquickitem::mouseGrab()
1135 QQuickCanvas *canvas = new QQuickCanvas;
1136 canvas->resize(200, 200);
1139 TestItem *child1 = new TestItem;
1140 child1->setAcceptedMouseButtons(Qt::LeftButton);
1141 child1->setSize(QSizeF(200, 100));
1142 child1->setParentItem(canvas->rootItem());
1144 TestItem *child2 = new TestItem;
1145 child2->setAcceptedMouseButtons(Qt::LeftButton);
1147 child2->setSize(QSizeF(200, 100));
1148 child2->setParentItem(canvas->rootItem());
1150 QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
1152 QVERIFY(canvas->mouseGrabberItem() == child1);
1155 QCOMPARE(child1->pressCount, 1);
1156 QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
1158 QVERIFY(canvas->mouseGrabberItem() == 0);
1159 QCOMPARE(child1->releaseCount, 1);
1161 QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
1163 QVERIFY(canvas->mouseGrabberItem() == child1);
1164 QCOMPARE(child1->pressCount, 2);
1165 child1->setEnabled(false);
1166 QVERIFY(canvas->mouseGrabberItem() == 0);
1167 QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
1169 QCOMPARE(child1->releaseCount, 1);
1170 child1->setEnabled(true);
1172 QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
1174 QVERIFY(canvas->mouseGrabberItem() == child1);
1175 QCOMPARE(child1->pressCount, 3);
1176 child1->setVisible(false);
1177 QVERIFY(canvas->mouseGrabberItem() == 0);
1178 QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
1179 QCOMPARE(child1->releaseCount, 1);
1180 child1->setVisible(true);
1182 QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
1184 QVERIFY(canvas->mouseGrabberItem() == child1);
1185 QCOMPARE(child1->pressCount, 4);
1186 child2->grabMouse();
1187 QVERIFY(canvas->mouseGrabberItem() == child2);
1188 QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
1190 QCOMPARE(child1->releaseCount, 1);
1191 QCOMPARE(child2->releaseCount, 1);
1193 child2->grabMouse();
1194 QVERIFY(canvas->mouseGrabberItem() == child2);
1195 QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
1197 QCOMPARE(child1->pressCount, 4);
1198 QCOMPARE(child2->pressCount, 1);
1199 QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
1201 QCOMPARE(child1->releaseCount, 1);
1202 QCOMPARE(child2->releaseCount, 2);
1209 void tst_qquickitem::touchEventAcceptIgnore_data()
1211 QTest::addColumn<bool>("itemSupportsTouch");
1213 QTest::newRow("with touch") << true;
1214 QTest::newRow("without touch") << false;
1217 void tst_qquickitem::touchEventAcceptIgnore()
1219 QFETCH(bool, itemSupportsTouch);
1221 TestCanvas *canvas = new TestCanvas;
1222 canvas->resize(100, 100);
1225 TestItem *item = new TestItem;
1226 item->setSize(QSizeF(100, 100));
1227 item->setParentItem(canvas->rootItem());
1228 item->acceptIncomingTouchEvents = itemSupportsTouch;
1230 static QTouchDevice* device = 0;
1232 device =new QTouchDevice;
1233 device->setType(QTouchDevice::TouchScreen);
1234 QWindowSystemInterface::registerTouchDevice(device);
1237 // Send Begin, Update & End touch sequence
1239 QTouchEvent::TouchPoint point;
1241 point.setPos(QPointF(50, 50));
1242 point.setScreenPos(point.pos());
1243 point.setState(Qt::TouchPointPressed);
1245 QTouchEvent event(QEvent::TouchBegin, device,
1247 Qt::TouchPointPressed,
1248 QList<QTouchEvent::TouchPoint>() << point);
1249 event.setAccepted(true);
1251 item->touchEventReached = false;
1253 bool accepted = canvas->event(&event);
1255 QVERIFY(item->touchEventReached);
1256 QCOMPARE(accepted && event.isAccepted(), itemSupportsTouch);
1259 QTouchEvent::TouchPoint point;
1261 point.setPos(QPointF(60, 60));
1262 point.setScreenPos(point.pos());
1263 point.setState(Qt::TouchPointMoved);
1265 QTouchEvent event(QEvent::TouchUpdate, device,
1267 Qt::TouchPointMoved,
1268 QList<QTouchEvent::TouchPoint>() << point);
1269 event.setAccepted(true);
1271 item->touchEventReached = false;
1273 bool accepted = canvas->event(&event);
1275 QCOMPARE(item->touchEventReached, itemSupportsTouch);
1276 QCOMPARE(accepted && event.isAccepted(), itemSupportsTouch);
1279 QTouchEvent::TouchPoint point;
1281 point.setPos(QPointF(60, 60));
1282 point.setScreenPos(point.pos());
1283 point.setState(Qt::TouchPointReleased);
1285 QTouchEvent event(QEvent::TouchEnd, device,
1287 Qt::TouchPointReleased,
1288 QList<QTouchEvent::TouchPoint>() << point);
1289 event.setAccepted(true);
1291 item->touchEventReached = false;
1293 bool accepted = canvas->event(&event);
1295 QCOMPARE(item->touchEventReached, itemSupportsTouch);
1296 QCOMPARE(accepted && event.isAccepted(), itemSupportsTouch);
1303 void tst_qquickitem::polishOutsideAnimation()
1305 QQuickCanvas *canvas = new QQuickCanvas;
1306 canvas->resize(200, 200);
1309 TestPolishItem *item = new TestPolishItem(canvas->rootItem());
1310 item->setSize(QSizeF(200, 100));
1313 QTimer::singleShot(10, item, SLOT(doPolish()));
1314 QTRY_VERIFY(item->wasPolished);
1320 void tst_qquickitem::polishOnCompleted()
1322 QQuickView *view = new QQuickView;
1323 view->setSource(testFileUrl("polishOnCompleted.qml"));
1326 TestPolishItem *item = qobject_cast<TestPolishItem*>(view->rootObject());
1330 QSKIP("QTBUG-21590 view does not reliably receive polish without a running animation");
1333 QTRY_VERIFY(item->wasPolished);
1338 void tst_qquickitem::wheelEvent_data()
1340 QTest::addColumn<bool>("visible");
1341 QTest::addColumn<bool>("enabled");
1343 QTest::newRow("visible and enabled") << true << true;
1344 QTest::newRow("visible and disabled") << true << false;
1345 QTest::newRow("invisible and enabled") << false << true;
1346 QTest::newRow("invisible and disabled") << false << false;
1349 void tst_qquickitem::wheelEvent()
1351 QFETCH(bool, visible);
1352 QFETCH(bool, enabled);
1354 const bool shouldReceiveWheelEvents = visible && enabled;
1356 QQuickCanvas *canvas = new QQuickCanvas;
1357 canvas->resize(200, 200);
1360 TestItem *item = new TestItem;
1361 item->setSize(QSizeF(200, 100));
1362 item->setParentItem(canvas->rootItem());
1364 item->setEnabled(enabled);
1365 item->setVisible(visible);
1367 QWheelEvent event(QPoint(100, 50), -120, Qt::NoButton, Qt::NoModifier, Qt::Vertical);
1368 event.setAccepted(false);
1369 QGuiApplication::sendEvent(canvas, &event);
1371 if (shouldReceiveWheelEvents) {
1372 QVERIFY(event.isAccepted());
1373 QCOMPARE(item->wheelCount, 1);
1375 QVERIFY(!event.isAccepted());
1376 QCOMPARE(item->wheelCount, 0);
1382 class HoverItem : public QQuickItem
1386 HoverItem(QQuickItem *parent = 0)
1387 : QQuickItem(parent), hoverEnterCount(0), hoverMoveCount(0), hoverLeaveCount(0)
1389 void resetCounters() {
1390 hoverEnterCount = 0;
1392 hoverLeaveCount = 0;
1394 int hoverEnterCount;
1396 int hoverLeaveCount;
1398 virtual void hoverEnterEvent(QHoverEvent *event) {
1402 virtual void hoverMoveEvent(QHoverEvent *event) {
1406 virtual void hoverLeaveEvent(QHoverEvent *event) {
1412 void tst_qquickitem::hoverEvent_data()
1414 QTest::addColumn<bool>("visible");
1415 QTest::addColumn<bool>("enabled");
1416 QTest::addColumn<bool>("acceptHoverEvents");
1418 QTest::newRow("visible, enabled, accept hover") << true << true << true;
1419 QTest::newRow("visible, disabled, accept hover") << true << false << true;
1420 QTest::newRow("invisible, enabled, accept hover") << false << true << true;
1421 QTest::newRow("invisible, disabled, accept hover") << false << false << true;
1423 QTest::newRow("visible, enabled, not accept hover") << true << true << false;
1424 QTest::newRow("visible, disabled, not accept hover") << true << false << false;
1425 QTest::newRow("invisible, enabled, not accept hover") << false << true << false;
1426 QTest::newRow("invisible, disabled, not accept hover") << false << false << false;
1429 // ### For some unknown reason QTest::mouseMove() isn't working correctly.
1430 static void sendMouseMove(QObject *object, const QPoint &position)
1432 QMouseEvent moveEvent(QEvent::MouseMove, position, Qt::NoButton, Qt::NoButton, 0);
1433 QGuiApplication::sendEvent(object, &moveEvent);
1436 void tst_qquickitem::hoverEvent()
1438 QFETCH(bool, visible);
1439 QFETCH(bool, enabled);
1440 QFETCH(bool, acceptHoverEvents);
1442 QQuickCanvas *canvas = new QQuickCanvas();
1443 canvas->resize(200, 200);
1446 HoverItem *item = new HoverItem;
1447 item->setSize(QSizeF(100, 100));
1448 item->setParentItem(canvas->rootItem());
1450 item->setEnabled(enabled);
1451 item->setVisible(visible);
1452 item->setAcceptHoverEvents(acceptHoverEvents);
1454 const QPoint outside(150, 150);
1455 const QPoint inside(50, 50);
1456 const QPoint anotherInside(51, 51);
1458 sendMouseMove(canvas, outside);
1459 item->resetCounters();
1461 // Enter, then move twice inside, then leave.
1462 sendMouseMove(canvas, inside);
1463 sendMouseMove(canvas, anotherInside);
1464 sendMouseMove(canvas, inside);
1465 sendMouseMove(canvas, outside);
1467 const bool shouldReceiveHoverEvents = visible && enabled && acceptHoverEvents;
1468 if (shouldReceiveHoverEvents) {
1469 QCOMPARE(item->hoverEnterCount, 1);
1470 QCOMPARE(item->hoverMoveCount, 2);
1471 QCOMPARE(item->hoverLeaveCount, 1);
1473 QCOMPARE(item->hoverEnterCount, 0);
1474 QCOMPARE(item->hoverMoveCount, 0);
1475 QCOMPARE(item->hoverLeaveCount, 0);
1481 void tst_qquickitem::hoverEventInParent()
1483 QQuickCanvas *canvas = new QQuickCanvas();
1484 canvas->resize(200, 200);
1487 HoverItem *parentItem = new HoverItem(canvas->rootItem());
1488 parentItem->setSize(QSizeF(200, 200));
1489 parentItem->setAcceptHoverEvents(true);
1491 HoverItem *leftItem = new HoverItem(parentItem);
1492 leftItem->setSize(QSizeF(100, 200));
1493 leftItem->setAcceptHoverEvents(true);
1495 HoverItem *rightItem = new HoverItem(parentItem);
1496 rightItem->setSize(QSizeF(100, 200));
1497 rightItem->setPos(QPointF(100, 0));
1498 rightItem->setAcceptHoverEvents(true);
1500 const QPoint insideLeft(50, 100);
1501 const QPoint insideRight(150, 100);
1503 sendMouseMove(canvas, insideLeft);
1504 parentItem->resetCounters();
1505 leftItem->resetCounters();
1506 rightItem->resetCounters();
1508 sendMouseMove(canvas, insideRight);
1509 QCOMPARE(parentItem->hoverEnterCount, 0);
1510 QCOMPARE(parentItem->hoverLeaveCount, 0);
1511 QCOMPARE(leftItem->hoverEnterCount, 0);
1512 QCOMPARE(leftItem->hoverLeaveCount, 1);
1513 QCOMPARE(rightItem->hoverEnterCount, 1);
1514 QCOMPARE(rightItem->hoverLeaveCount, 0);
1516 sendMouseMove(canvas, insideLeft);
1517 QCOMPARE(parentItem->hoverEnterCount, 0);
1518 QCOMPARE(parentItem->hoverLeaveCount, 0);
1519 QCOMPARE(leftItem->hoverEnterCount, 1);
1520 QCOMPARE(leftItem->hoverLeaveCount, 1);
1521 QCOMPARE(rightItem->hoverEnterCount, 1);
1522 QCOMPARE(rightItem->hoverLeaveCount, 1);
1527 void tst_qquickitem::paintOrder_data()
1529 const QUrl order1Url = testFileUrl("order.1.qml");
1530 const QUrl order2Url = testFileUrl("order.2.qml");
1532 QTest::addColumn<QUrl>("source");
1533 QTest::addColumn<int>("op");
1534 QTest::addColumn<QVariant>("param1");
1535 QTest::addColumn<QVariant>("param2");
1536 QTest::addColumn<QStringList>("expected");
1538 QTest::newRow("test 1 noop") << order1Url
1539 << int(NoOp) << QVariant() << QVariant()
1540 << (QStringList() << "1" << "2" << "3");
1541 QTest::newRow("test 1 add") << order1Url
1542 << int(Append) << QVariant("new") << QVariant()
1543 << (QStringList() << "1" << "2" << "3" << "new");
1544 QTest::newRow("test 1 remove") << order1Url
1545 << int(Remove) << QVariant(1) << QVariant()
1546 << (QStringList() << "1" << "3");
1547 QTest::newRow("test 1 stack before") << order1Url
1548 << int(StackBefore) << QVariant(2) << QVariant(1)
1549 << (QStringList() << "1" << "3" << "2");
1550 QTest::newRow("test 1 stack after") << order1Url
1551 << int(StackAfter) << QVariant(0) << QVariant(1)
1552 << (QStringList() << "2" << "1" << "3");
1553 QTest::newRow("test 1 set z") << order1Url
1554 << int(SetZ) << QVariant(1) << QVariant(qreal(1.))
1555 << (QStringList() << "1" << "3" << "2");
1557 QTest::newRow("test 2 noop") << order2Url
1558 << int(NoOp) << QVariant() << QVariant()
1559 << (QStringList() << "1" << "3" << "2");
1560 QTest::newRow("test 2 add") << order2Url
1561 << int(Append) << QVariant("new") << QVariant()
1562 << (QStringList() << "1" << "3" << "new" << "2");
1563 QTest::newRow("test 2 remove 1") << order2Url
1564 << int(Remove) << QVariant(1) << QVariant()
1565 << (QStringList() << "1" << "3");
1566 QTest::newRow("test 2 remove 2") << order2Url
1567 << int(Remove) << QVariant(2) << QVariant()
1568 << (QStringList() << "1" << "2");
1569 QTest::newRow("test 2 stack before 1") << order2Url
1570 << int(StackBefore) << QVariant(1) << QVariant(0)
1571 << (QStringList() << "1" << "3" << "2");
1572 QTest::newRow("test 2 stack before 2") << order2Url
1573 << int(StackBefore) << QVariant(2) << QVariant(0)
1574 << (QStringList() << "3" << "1" << "2");
1575 QTest::newRow("test 2 stack after 1") << order2Url
1576 << int(StackAfter) << QVariant(0) << QVariant(1)
1577 << (QStringList() << "1" << "3" << "2");
1578 QTest::newRow("test 2 stack after 2") << order2Url
1579 << int(StackAfter) << QVariant(0) << QVariant(2)
1580 << (QStringList() << "3" << "1" << "2");
1581 QTest::newRow("test 1 set z") << order1Url
1582 << int(SetZ) << QVariant(2) << QVariant(qreal(2.))
1583 << (QStringList() << "1" << "2" << "3");
1586 void tst_qquickitem::paintOrder()
1588 QFETCH(QUrl, source);
1590 QFETCH(QVariant, param1);
1591 QFETCH(QVariant, param2);
1592 QFETCH(QStringList, expected);
1595 view.setSource(source);
1597 QQuickItem *root = qobject_cast<QQuickItem*>(view.rootObject());
1602 QQuickItem *item = new QQuickItem(root);
1603 item->setObjectName(param1.toString());
1607 QQuickItem *item = root->childItems().at(param1.toInt());
1612 QQuickItem *item1 = root->childItems().at(param1.toInt());
1613 QQuickItem *item2 = root->childItems().at(param2.toInt());
1614 item1->stackBefore(item2);
1618 QQuickItem *item1 = root->childItems().at(param1.toInt());
1619 QQuickItem *item2 = root->childItems().at(param2.toInt());
1620 item1->stackAfter(item2);
1624 QQuickItem *item = root->childItems().at(param1.toInt());
1625 item->setZ(param2.toReal());
1632 QList<QQuickItem*> list = QQuickItemPrivate::get(root)->paintOrderChildItems();
1635 for (int i = 0; i < list.count(); ++i)
1636 items << list.at(i)->objectName();
1638 QCOMPARE(items, expected);
1642 QTEST_MAIN(tst_qquickitem)
1644 #include "tst_qquickitem.moc"