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 <QtGui/qwindowsysteminterface_qpa.h>
45 #include <QtQuick/qquickitem.h>
46 #include <QtQuick/qquickcanvas.h>
47 #include <QtQuick/qquickview.h>
48 #include <QtWidgets/QGraphicsSceneMouseEvent>
49 #include "private/qquickfocusscope_p.h"
50 #include "private/qquickitem_p.h"
53 #include "../../shared/util.h"
55 class TestItem : public QQuickItem
59 TestItem(QQuickItem *parent = 0)
60 : QQuickItem(parent), focused(false), pressCount(0), releaseCount(0)
61 , wheelCount(0), acceptIncomingTouchEvents(true)
62 , touchEventReached(false) {}
68 bool acceptIncomingTouchEvents;
69 bool touchEventReached;
71 virtual void focusInEvent(QFocusEvent *) { Q_ASSERT(!focused); focused = true; }
72 virtual void focusOutEvent(QFocusEvent *) { Q_ASSERT(focused); focused = false; }
73 virtual void mousePressEvent(QMouseEvent *event) { event->accept(); ++pressCount; }
74 virtual void mouseReleaseEvent(QMouseEvent *event) { event->accept(); ++releaseCount; }
75 virtual void touchEvent(QTouchEvent *event) {
76 touchEventReached = true;
77 event->setAccepted(acceptIncomingTouchEvents);
79 virtual void wheelEvent(QWheelEvent *event) { event->accept(); ++wheelCount; }
82 class TestCanvas: public QQuickCanvas
89 virtual bool event(QEvent *event)
91 return QQuickCanvas::event(event);
95 class TestPolishItem : public QQuickItem
99 TestPolishItem(QQuickItem *parent = 0)
100 : QQuickItem(parent), wasPolished(false) {
107 virtual void updatePolish() {
117 class TestFocusScope : public QQuickFocusScope
121 TestFocusScope(QQuickItem *parent = 0) : QQuickFocusScope(parent), focused(false) {}
125 virtual void focusInEvent(QFocusEvent *) { Q_ASSERT(!focused); focused = true; }
126 virtual void focusOutEvent(QFocusEvent *) { Q_ASSERT(focused); focused = false; }
129 class tst_qquickitem : public QQmlDataTest
140 void addedToCanvas();
142 void multipleFocusClears();
143 void focusSubItemInNonFocusScope();
144 void parentItemWithFocus();
145 void reparentFocusedItem();
148 void setParentItem();
155 void touchEventAcceptIgnore_data();
156 void touchEventAcceptIgnore();
157 void polishOutsideAnimation();
158 void polishOnCompleted();
160 void wheelEvent_data();
162 void hoverEvent_data();
164 void hoverEventInParent();
166 void paintOrder_data();
172 NoOp, Append, Remove, StackBefore, StackAfter, SetZ
175 void ensureFocus(QWindow *w) {
177 w->requestActivateWindow();
178 qApp->processEvents();
182 void tst_qquickitem::initTestCase()
184 QQmlDataTest::initTestCase();
185 qmlRegisterType<TestPolishItem>("Qt.test", 1, 0, "TestPolishItem");
188 // Focus still updates when outside a canvas
189 void tst_qquickitem::noCanvas()
191 QQuickItem *root = new TestItem;
192 QQuickItem *child = new TestItem(root);
193 QQuickItem *scope = new TestItem(root);
194 QQuickFocusScope *scopedChild = new TestFocusScope(scope);
195 QQuickFocusScope *scopedChild2 = new TestFocusScope(scope);
197 QCOMPARE(root->hasFocus(), false);
198 QCOMPARE(child->hasFocus(), false);
199 QCOMPARE(scope->hasFocus(), false);
200 QCOMPARE(scopedChild->hasFocus(), false);
201 QCOMPARE(scopedChild2->hasFocus(), false);
203 root->setFocus(true);
204 scope->setFocus(true);
205 scopedChild2->setFocus(true);
206 QCOMPARE(root->hasFocus(), false);
207 QCOMPARE(child->hasFocus(), false);
208 QCOMPARE(scope->hasFocus(), false);
209 QCOMPARE(scopedChild->hasFocus(), false);
210 QCOMPARE(scopedChild2->hasFocus(), true);
212 root->setFocus(false);
213 child->setFocus(true);
214 scopedChild->setFocus(true);
215 scope->setFocus(false);
216 QCOMPARE(root->hasFocus(), false);
217 QCOMPARE(child->hasFocus(), false);
218 QCOMPARE(scope->hasFocus(), false);
219 QCOMPARE(scopedChild->hasFocus(), true);
220 QCOMPARE(scopedChild2->hasFocus(), false);
226 FocusData() : focus(false), activeFocus(false) {}
228 void set(bool f, bool af) { focus = f; activeFocus = af; }
232 struct FocusState : public QHash<QQuickItem *, FocusData>
234 FocusState() : activeFocusItem(0) {}
235 FocusState &operator<<(QQuickItem *item) {
236 insert(item, FocusData());
240 void active(QQuickItem *i) {
243 QQuickItem *activeFocusItem;
248 if (focusState.activeFocusItem) { \
249 QCOMPARE(canvas.activeFocusItem(), focusState.activeFocusItem); \
250 if (qobject_cast<TestItem *>(canvas.activeFocusItem())) \
251 QCOMPARE(qobject_cast<TestItem *>(canvas.activeFocusItem())->focused, true); \
252 else if (qobject_cast<TestFocusScope *>(canvas.activeFocusItem())) \
253 QCOMPARE(qobject_cast<TestFocusScope *>(canvas.activeFocusItem())->focused, true); \
255 QCOMPARE(canvas.activeFocusItem(), canvas.rootItem()); \
257 for (QHash<QQuickItem *, FocusData>::Iterator iter = focusState.begin(); \
258 iter != focusState.end(); \
260 QCOMPARE(iter.key()->hasFocus(), iter.value().focus); \
261 QCOMPARE(iter.key()->hasActiveFocus(), iter.value().activeFocus); \
265 // Tests a simple set of top-level scoped items
266 void tst_qquickitem::simpleFocus()
269 ensureFocus(&canvas);
272 QSKIP("QTBUG-24094: fails on Mac OS X 10.7");
275 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
277 QQuickItem *l1c1 = new TestItem(canvas.rootItem());
278 QQuickItem *l1c2 = new TestItem(canvas.rootItem());
279 QQuickItem *l1c3 = new TestItem(canvas.rootItem());
281 QQuickItem *l2c1 = new TestItem(l1c1);
282 QQuickItem *l2c2 = new TestItem(l1c1);
283 QQuickItem *l2c3 = new TestItem(l1c3);
285 FocusState focusState;
286 focusState << l1c1 << l1c2 << l1c3
287 << l2c1 << l2c2 << l2c3;
290 l1c1->setFocus(true);
291 focusState[l1c1].set(true, true);
292 focusState.active(l1c1);
295 l2c3->setFocus(true);
296 focusState[l1c1].set(false, false);
297 focusState[l2c3].set(true, true);
298 focusState.active(l2c3);
301 l1c3->setFocus(true);
302 focusState[l2c3].set(false, false);
303 focusState[l1c3].set(true, true);
304 focusState.active(l1c3);
307 l1c2->setFocus(false);
310 l1c3->setFocus(false);
311 focusState[l1c3].set(false, false);
312 focusState.active(0);
315 l2c1->setFocus(true);
316 focusState[l2c1].set(true, true);
317 focusState.active(l2c1);
321 // Items with a focus scope
322 void tst_qquickitem::scopedFocus()
325 ensureFocus(&canvas);
326 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
328 QQuickItem *l1c1 = new TestItem(canvas.rootItem());
329 QQuickItem *l1c2 = new TestItem(canvas.rootItem());
330 QQuickItem *l1c3 = new TestItem(canvas.rootItem());
332 QQuickItem *l2c1 = new TestItem(l1c1);
333 QQuickItem *l2c2 = new TestItem(l1c1);
334 QQuickItem *l2c3 = new TestFocusScope(l1c3);
336 QQuickItem *l3c1 = new TestItem(l2c3);
337 QQuickItem *l3c2 = new TestFocusScope(l2c3);
339 QQuickItem *l4c1 = new TestItem(l3c2);
340 QQuickItem *l4c2 = new TestItem(l3c2);
342 FocusState focusState;
343 focusState << l1c1 << l1c2 << l1c3
344 << l2c1 << l2c2 << l2c3
349 l4c2->setFocus(true);
350 focusState[l4c2].set(true, false);
353 l4c1->setFocus(true);
354 focusState[l4c2].set(false, false);
355 focusState[l4c1].set(true, false);
358 l1c1->setFocus(true);
359 focusState[l1c1].set(true, true);
360 focusState.active(l1c1);
363 l3c2->setFocus(true);
364 focusState[l3c2].set(true, false);
367 l2c3->setFocus(true);
368 focusState[l1c1].set(false, false);
369 focusState[l2c3].set(true, true);
370 focusState[l3c2].set(true, true);
371 focusState[l4c1].set(true, true);
372 focusState.active(l4c1);
375 l3c2->setFocus(false);
376 focusState[l3c2].set(false, false);
377 focusState[l4c1].set(true, false);
378 focusState.active(l2c3);
381 l3c2->setFocus(true);
382 focusState[l3c2].set(true, true);
383 focusState[l4c1].set(true, true);
384 focusState.active(l4c1);
387 l4c1->setFocus(false);
388 focusState[l4c1].set(false, false);
389 focusState.active(l3c2);
392 l1c3->setFocus(true);
393 focusState[l1c3].set(true, true);
394 focusState[l2c3].set(false, false);
395 focusState[l3c2].set(true, false);
396 focusState.active(l1c3);
400 // Tests focus corrects itself when a tree is added to a canvas for the first time
401 void tst_qquickitem::addedToCanvas()
405 ensureFocus(&canvas);
406 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
408 QQuickItem *item = new TestItem;
410 FocusState focusState;
413 item->setFocus(true);
414 focusState[item].set(true, false);
417 item->setParentItem(canvas.rootItem());
418 focusState[item].set(true, true);
419 focusState.active(item);
425 ensureFocus(&canvas);
426 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
428 QQuickItem *item = new TestItem(canvas.rootItem());
430 QQuickItem *tree = new TestItem;
431 QQuickItem *c1 = new TestItem(tree);
432 QQuickItem *c2 = new TestItem(tree);
434 FocusState focusState;
435 focusState << item << tree << c1 << c2;
437 item->setFocus(true);
440 focusState[item].set(true, true);
441 focusState[c1].set(false, false);
442 focusState[c2].set(true, false);
443 focusState.active(item);
446 tree->setParentItem(item);
447 focusState[c1].set(false, false);
448 focusState[c2].set(false, false);
454 ensureFocus(&canvas);
455 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
457 QQuickItem *tree = new TestItem;
458 QQuickItem *c1 = new TestItem(tree);
459 QQuickItem *c2 = new TestItem(tree);
461 FocusState focusState;
462 focusState << tree << c1 << c2;
465 focusState[c1].set(false, false);
466 focusState[c2].set(true, false);
469 tree->setParentItem(canvas.rootItem());
470 focusState[c1].set(false, false);
471 focusState[c2].set(true, true);
472 focusState.active(c2);
478 ensureFocus(&canvas);
479 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
480 QQuickItem *tree = new TestFocusScope;
481 QQuickItem *c1 = new TestItem(tree);
482 QQuickItem *c2 = new TestItem(tree);
484 FocusState focusState;
485 focusState << tree << c1 << c2;
488 focusState[c1].set(false, false);
489 focusState[c2].set(true, false);
492 tree->setParentItem(canvas.rootItem());
493 focusState[c1].set(false, false);
494 focusState[c2].set(true, false);
497 tree->setFocus(true);
498 focusState[tree].set(true, true);
499 focusState[c2].set(true, true);
500 focusState.active(c2);
506 ensureFocus(&canvas);
507 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
508 QQuickItem *tree = new TestFocusScope;
509 QQuickItem *c1 = new TestItem(tree);
510 QQuickItem *c2 = new TestItem(tree);
512 FocusState focusState;
513 focusState << tree << c1 << c2;
514 tree->setFocus(true);
517 focusState[tree].set(true, false);
518 focusState[c1].set(false, false);
519 focusState[c2].set(true, false);
522 tree->setParentItem(canvas.rootItem());
523 focusState[tree].set(true, true);
524 focusState[c1].set(false, false);
525 focusState[c2].set(true, true);
526 focusState.active(c2);
532 ensureFocus(&canvas);
533 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
534 QQuickItem *child = new TestItem(canvas.rootItem());
535 QQuickItem *tree = new TestFocusScope;
536 QQuickItem *c1 = new TestItem(tree);
537 QQuickItem *c2 = new TestItem(tree);
539 FocusState focusState;
540 focusState << child << tree << c1 << c2;
541 child->setFocus(true);
542 tree->setFocus(true);
545 focusState[child].set(true, true);
546 focusState[tree].set(true, false);
547 focusState[c1].set(false, false);
548 focusState[c2].set(true, false);
549 focusState.active(child);
552 tree->setParentItem(canvas.rootItem());
553 focusState[tree].set(false, false);
554 focusState[c1].set(false, false);
555 focusState[c2].set(true, false);
558 tree->setFocus(true);
559 focusState[child].set(false, false);
560 focusState[tree].set(true, true);
561 focusState[c2].set(true, true);
562 focusState.active(c2);
567 void tst_qquickitem::changeParent()
569 // Parent to no parent
572 ensureFocus(&canvas);
573 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
574 QQuickItem *child = new TestItem(canvas.rootItem());
576 FocusState focusState;
580 child->setFocus(true);
581 focusState[child].set(true, true);
582 focusState.active(child);
585 child->setParentItem(0);
586 focusState[child].set(true, false);
587 focusState.active(0);
591 // Different parent, same focus scope
594 ensureFocus(&canvas);
595 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
596 QQuickItem *child = new TestItem(canvas.rootItem());
597 QQuickItem *child2 = new TestItem(canvas.rootItem());
599 FocusState focusState;
600 focusState << child << child2;
603 child->setFocus(true);
604 focusState[child].set(true, true);
605 focusState.active(child);
608 child->setParentItem(child2);
612 // Different parent, different focus scope
615 ensureFocus(&canvas);
616 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
617 QQuickItem *child = new TestItem(canvas.rootItem());
618 QQuickItem *child2 = new TestFocusScope(canvas.rootItem());
619 QQuickItem *item = new TestItem(child);
621 FocusState focusState;
622 focusState << child << child2 << item;
625 item->setFocus(true);
626 focusState[item].set(true, true);
627 focusState.active(item);
630 item->setParentItem(child2);
631 focusState[item].set(true, false);
632 focusState.active(0);
637 ensureFocus(&canvas);
638 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
639 QQuickItem *child = new TestItem(canvas.rootItem());
640 QQuickItem *child2 = new TestFocusScope(canvas.rootItem());
641 QQuickItem *item = new TestItem(child2);
643 FocusState focusState;
644 focusState << child << child2 << item;
647 item->setFocus(true);
648 focusState[item].set(true, false);
649 focusState.active(0);
652 item->setParentItem(child);
653 focusState[item].set(true, true);
654 focusState.active(item);
659 ensureFocus(&canvas);
660 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
661 QQuickItem *child = new TestItem(canvas.rootItem());
662 QQuickItem *child2 = new TestFocusScope(canvas.rootItem());
663 QQuickItem *item = new TestItem(child2);
665 FocusState focusState;
666 focusState << child << child2 << item;
669 child->setFocus(true);
670 item->setFocus(true);
671 focusState[child].set(true, true);
672 focusState[item].set(true, false);
673 focusState.active(child);
676 item->setParentItem(child);
677 focusState[item].set(false, false);
681 // child has active focus, then its fs parent changes parent to 0, then
682 // child is deleted, then its parent changes again to a valid parent
685 ensureFocus(&canvas);
686 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
687 QQuickItem *item = new TestFocusScope(canvas.rootItem());
688 QQuickItem *child = new TestItem(item);
689 QQuickItem *child2 = new TestItem;
691 FocusState focusState;
692 focusState << item << child;
695 item->setFocus(true);
696 child->setFocus(true);
697 focusState[child].set(true, true);
698 focusState[item].set(true, true);
699 focusState.active(child);
702 item->setParentItem(0);
703 focusState[child].set(true, false);
704 focusState[item].set(true, false);
705 focusState.active(0);
708 focusState.remove(child);
710 item->setParentItem(canvas.rootItem());
711 focusState[item].set(true, true);
712 focusState.active(item);
718 void tst_qquickitem::multipleFocusClears()
720 //Multiple clears of focus inside a focus scope shouldn't crash. QTBUG-24714
721 QQuickView *view = new QQuickView;
722 view->setSource(testFileUrl("multipleFocusClears.qml"));
725 QTRY_VERIFY(QGuiApplication::focusWindow() == view);
728 void tst_qquickitem::focusSubItemInNonFocusScope()
730 QQuickView *view = new QQuickView;
731 view->setSource(testFileUrl("focusSubItemInNonFocusScope.qml"));
733 qApp->processEvents();
735 QQuickItem *dummyItem = view->rootObject()->findChild<QQuickItem *>("dummyItem");
738 QQuickItem *textInput = view->rootObject()->findChild<QQuickItem *>("textInput");
741 QVERIFY(dummyItem->hasFocus());
742 QVERIFY(!textInput->hasFocus());
743 QVERIFY(dummyItem->hasActiveFocus());
745 QVERIFY(QMetaObject::invokeMethod(textInput, "forceActiveFocus"));
747 QVERIFY(!dummyItem->hasFocus());
748 QVERIFY(textInput->hasFocus());
749 QVERIFY(textInput->hasActiveFocus());
754 void tst_qquickitem::parentItemWithFocus()
757 ensureFocus(&canvas);
758 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
763 FocusState focusState;
764 focusState << &parent << &child;
767 parent.setFocus(true);
768 child.setFocus(true);
769 focusState[&parent].set(true, false);
770 focusState[&child].set(true, false);
773 child.setParentItem(&parent);
774 focusState[&parent].set(true, false);
775 focusState[&child].set(false, false);
778 parent.setParentItem(canvas.rootItem());
779 focusState[&parent].set(true, true);
780 focusState[&child].set(false, false);
781 focusState.active(&parent);
784 child.forceActiveFocus();
785 focusState[&parent].set(false, false);
786 focusState[&child].set(true, true);
787 focusState.active(&child);
792 QQuickItem grandchild(&child);
794 FocusState focusState;
795 focusState << &parent << &child << &grandchild;
798 parent.setFocus(true);
799 grandchild.setFocus(true);
800 focusState[&parent].set(true, false);
801 focusState[&child].set(false, false);
802 focusState[&grandchild].set(true, false);
805 child.setParentItem(&parent);
806 focusState[&parent].set(true, false);
807 focusState[&child].set(false, false);
808 focusState[&grandchild].set(false, false);
811 parent.setParentItem(canvas.rootItem());
812 focusState[&parent].set(true, true);
813 focusState[&child].set(false, false);
814 focusState[&grandchild].set(false, false);
815 focusState.active(&parent);
818 grandchild.forceActiveFocus();
819 focusState[&parent].set(false, false);
820 focusState[&child].set(false, false);
821 focusState[&grandchild].set(true, true);
822 focusState.active(&grandchild);
831 FocusState focusState;
832 focusState << &parent << &child1 << &child2;
833 parent.setFocus(true);
834 child1.setParentItem(&parent);
835 child2.setParentItem(&parent);
836 focusState[&parent].set(true, false);
837 focusState[&child1].set(false, false);
838 focusState[&child2].set(false, false);
841 child1.setFocus(true);
842 focusState[&parent].set(false, false);
843 focusState[&child1].set(true, false);
846 parent.setFocus(true);
847 focusState[&parent].set(true, false);
848 focusState[&child1].set(false, false);
853 void tst_qquickitem::reparentFocusedItem()
856 ensureFocus(&canvas);
857 QTRY_VERIFY(QGuiApplication::focusWindow() == &canvas);
859 QQuickItem parent(canvas.rootItem());
860 QQuickItem child(&parent);
861 QQuickItem sibling(&parent);
862 QQuickItem grandchild(&child);
864 FocusState focusState;
865 focusState << &parent << &child << &sibling << &grandchild;
868 grandchild.setFocus(true);
869 focusState[&parent].set(false, false);
870 focusState[&child].set(false, false);
871 focusState[&sibling].set(false, false);
872 focusState[&grandchild].set(true, true);
873 focusState.active(&grandchild);
876 // Parenting the item to another item within the same focus scope shouldn't change it's focus.
877 child.setParentItem(&sibling);
881 void tst_qquickitem::constructor()
883 QQuickItem *root = new QQuickItem;
884 QVERIFY(root->parent() == 0);
885 QVERIFY(root->parentItem() == 0);
887 QQuickItem *child1 = new QQuickItem(root);
888 QVERIFY(child1->parent() == root);
889 QVERIFY(child1->parentItem() == root);
890 QCOMPARE(root->childItems().count(), 1);
891 QCOMPARE(root->childItems().at(0), child1);
893 QQuickItem *child2 = new QQuickItem(root);
894 QVERIFY(child2->parent() == root);
895 QVERIFY(child2->parentItem() == root);
896 QCOMPARE(root->childItems().count(), 2);
897 QCOMPARE(root->childItems().at(0), child1);
898 QCOMPARE(root->childItems().at(1), child2);
903 void tst_qquickitem::setParentItem()
905 QQuickItem *root = new QQuickItem;
906 QVERIFY(root->parent() == 0);
907 QVERIFY(root->parentItem() == 0);
909 QQuickItem *child1 = new QQuickItem;
910 QVERIFY(child1->parent() == 0);
911 QVERIFY(child1->parentItem() == 0);
913 child1->setParentItem(root);
914 QVERIFY(child1->parent() == 0);
915 QVERIFY(child1->parentItem() == root);
916 QCOMPARE(root->childItems().count(), 1);
917 QCOMPARE(root->childItems().at(0), child1);
919 QQuickItem *child2 = new QQuickItem;
920 QVERIFY(child2->parent() == 0);
921 QVERIFY(child2->parentItem() == 0);
922 child2->setParentItem(root);
923 QVERIFY(child2->parent() == 0);
924 QVERIFY(child2->parentItem() == root);
925 QCOMPARE(root->childItems().count(), 2);
926 QCOMPARE(root->childItems().at(0), child1);
927 QCOMPARE(root->childItems().at(1), child2);
929 child1->setParentItem(0);
930 QVERIFY(child1->parent() == 0);
931 QVERIFY(child1->parentItem() == 0);
932 QCOMPARE(root->childItems().count(), 1);
933 QCOMPARE(root->childItems().at(0), child2);
937 QVERIFY(child1->parent() == 0);
938 QVERIFY(child1->parentItem() == 0);
939 QVERIFY(child2->parent() == 0);
940 QVERIFY(child2->parentItem() == 0);
946 void tst_qquickitem::visible()
948 QQuickItem *root = new QQuickItem;
950 QQuickItem *child1 = new QQuickItem;
951 child1->setParentItem(root);
953 QQuickItem *child2 = new QQuickItem;
954 child2->setParentItem(root);
956 QVERIFY(child1->isVisible());
957 QVERIFY(child2->isVisible());
959 root->setVisible(false);
960 QVERIFY(!child1->isVisible());
961 QVERIFY(!child2->isVisible());
963 root->setVisible(true);
964 QVERIFY(child1->isVisible());
965 QVERIFY(child2->isVisible());
967 child1->setVisible(false);
968 QVERIFY(!child1->isVisible());
969 QVERIFY(child2->isVisible());
971 child2->setParentItem(child1);
972 QVERIFY(!child1->isVisible());
973 QVERIFY(!child2->isVisible());
975 child2->setParentItem(root);
976 QVERIFY(!child1->isVisible());
977 QVERIFY(child2->isVisible());
984 void tst_qquickitem::enabled()
986 QQuickItem *root = new QQuickItem;
988 QQuickItem *child1 = new QQuickItem;
989 child1->setParentItem(root);
991 QQuickItem *child2 = new QQuickItem;
992 child2->setParentItem(root);
994 QVERIFY(child1->isEnabled());
995 QVERIFY(child2->isEnabled());
997 root->setEnabled(false);
998 QVERIFY(!child1->isEnabled());
999 QVERIFY(!child2->isEnabled());
1001 root->setEnabled(true);
1002 QVERIFY(child1->isEnabled());
1003 QVERIFY(child2->isEnabled());
1005 child1->setEnabled(false);
1006 QVERIFY(!child1->isEnabled());
1007 QVERIFY(child2->isEnabled());
1009 child2->setParentItem(child1);
1010 QVERIFY(!child1->isEnabled());
1011 QVERIFY(!child2->isEnabled());
1013 child2->setParentItem(root);
1014 QVERIFY(!child1->isEnabled());
1015 QVERIFY(child2->isEnabled());
1022 void tst_qquickitem::enabledFocus()
1024 QQuickCanvas canvas;
1025 ensureFocus(&canvas);
1027 QQuickFocusScope root;
1029 root.setFocus(true);
1030 root.setEnabled(false);
1032 QCOMPARE(root.isEnabled(), false);
1033 QCOMPARE(root.hasFocus(), true);
1034 QCOMPARE(root.hasActiveFocus(), false);
1036 root.setParentItem(canvas.rootItem());
1038 QCOMPARE(root.isEnabled(), false);
1039 QCOMPARE(root.hasFocus(), true);
1040 QCOMPARE(root.hasActiveFocus(), false);
1041 QCOMPARE(canvas.activeFocusItem(), canvas.rootItem());
1043 root.setEnabled(true);
1044 QCOMPARE(root.isEnabled(), true);
1045 QCOMPARE(root.hasFocus(), true);
1046 QCOMPARE(root.hasActiveFocus(), true);
1047 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&root));
1050 child1.setParentItem(&root);
1052 QCOMPARE(child1.isEnabled(), true);
1053 QCOMPARE(child1.hasFocus(), false);
1054 QCOMPARE(child1.hasActiveFocus(), false);
1055 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&root));
1058 child2.setFocus(true);
1059 child2.setParentItem(&root);
1061 QCOMPARE(root.isEnabled(), true);
1062 QCOMPARE(root.hasFocus(), true);
1063 QCOMPARE(root.hasActiveFocus(), true);
1064 QCOMPARE(child2.isEnabled(), true);
1065 QCOMPARE(child2.hasFocus(), true);
1066 QCOMPARE(child2.hasActiveFocus(), true);
1067 QCOMPARE(canvas.activeFocusItem(), &child2);
1069 child2.setEnabled(false);
1071 QCOMPARE(root.isEnabled(), true);
1072 QCOMPARE(root.hasFocus(), true);
1073 QCOMPARE(root.hasActiveFocus(), true);
1074 QCOMPARE(child1.isEnabled(), true);
1075 QCOMPARE(child1.hasFocus(), false);
1076 QCOMPARE(child1.hasActiveFocus(), false);
1077 QCOMPARE(child2.isEnabled(), false);
1078 QCOMPARE(child2.hasFocus(), true);
1079 QCOMPARE(child2.hasActiveFocus(), false);
1080 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&root));
1082 child1.setEnabled(false);
1083 QCOMPARE(child1.isEnabled(), false);
1084 QCOMPARE(child1.hasFocus(), false);
1085 QCOMPARE(child1.hasActiveFocus(), false);
1087 child1.setFocus(true);
1088 QCOMPARE(child1.isEnabled(), false);
1089 QCOMPARE(child1.hasFocus(), true);
1090 QCOMPARE(child1.hasActiveFocus(), false);
1091 QCOMPARE(child2.isEnabled(), false);
1092 QCOMPARE(child2.hasFocus(), false);
1093 QCOMPARE(child2.hasActiveFocus(), false);
1094 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&root));
1096 child1.setEnabled(true);
1097 QCOMPARE(child1.isEnabled(), true);
1098 QCOMPARE(child1.hasFocus(), true);
1099 QCOMPARE(child1.hasActiveFocus(), true);
1100 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&child1));
1102 root.setFocus(false);
1103 QCOMPARE(root.isEnabled(), true);
1104 QCOMPARE(root.hasFocus(), false);
1105 QCOMPARE(root.hasActiveFocus(), false);
1106 QCOMPARE(child1.isEnabled(), true);
1107 QCOMPARE(child1.hasFocus(), true);
1108 QCOMPARE(child1.hasActiveFocus(), false);
1109 QCOMPARE(canvas.activeFocusItem(), canvas.rootItem());
1111 child2.forceActiveFocus();
1112 QCOMPARE(root.isEnabled(), true);
1113 QCOMPARE(root.hasFocus(), true);
1114 QCOMPARE(root.hasActiveFocus(), true);
1115 QCOMPARE(child1.isEnabled(), true);
1116 QCOMPARE(child1.hasFocus(), false);
1117 QCOMPARE(child1.hasActiveFocus(), false);
1118 QCOMPARE(child2.isEnabled(), false);
1119 QCOMPARE(child2.hasFocus(), true);
1120 QCOMPARE(child2.hasActiveFocus(), false);
1121 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&root));
1123 root.setEnabled(false);
1124 QCOMPARE(root.isEnabled(), false);
1125 QCOMPARE(root.hasFocus(), true);
1126 QCOMPARE(root.hasActiveFocus(), false);
1127 QCOMPARE(child1.isEnabled(), false);
1128 QCOMPARE(child1.hasFocus(), false);
1129 QCOMPARE(child1.hasActiveFocus(), false);
1130 QCOMPARE(child2.isEnabled(), false);
1131 QCOMPARE(child2.hasFocus(), true);
1132 QCOMPARE(child2.hasActiveFocus(), false);
1133 QCOMPARE(canvas.activeFocusItem(), canvas.rootItem());
1135 child1.forceActiveFocus();
1136 QCOMPARE(root.isEnabled(), false);
1137 QCOMPARE(root.hasFocus(), true);
1138 QCOMPARE(root.hasActiveFocus(), false);
1139 QCOMPARE(child1.isEnabled(), false);
1140 QCOMPARE(child1.hasFocus(), true);
1141 QCOMPARE(child1.hasActiveFocus(), false);
1142 QCOMPARE(child2.isEnabled(), false);
1143 QCOMPARE(child2.hasFocus(), false);
1144 QCOMPARE(child2.hasActiveFocus(), false);
1145 QCOMPARE(canvas.activeFocusItem(), canvas.rootItem());
1147 root.setEnabled(true);
1148 QCOMPARE(root.isEnabled(), true);
1149 QCOMPARE(root.hasFocus(), true);
1150 QCOMPARE(root.hasActiveFocus(), true);
1151 QCOMPARE(child1.isEnabled(), true);
1152 QCOMPARE(child1.hasFocus(), true);
1153 QCOMPARE(child1.hasActiveFocus(), true);
1154 QCOMPARE(child2.isEnabled(), false);
1155 QCOMPARE(child2.hasFocus(), false);
1156 QCOMPARE(child2.hasActiveFocus(), false);
1157 QCOMPARE(canvas.activeFocusItem(), static_cast<QQuickItem *>(&child1));
1160 void tst_qquickitem::mouseGrab()
1162 QQuickCanvas *canvas = new QQuickCanvas;
1163 canvas->resize(200, 200);
1166 TestItem *child1 = new TestItem;
1167 child1->setAcceptedMouseButtons(Qt::LeftButton);
1168 child1->setSize(QSizeF(200, 100));
1169 child1->setParentItem(canvas->rootItem());
1171 TestItem *child2 = new TestItem;
1172 child2->setAcceptedMouseButtons(Qt::LeftButton);
1174 child2->setSize(QSizeF(200, 100));
1175 child2->setParentItem(canvas->rootItem());
1177 QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
1179 QVERIFY(canvas->mouseGrabberItem() == child1);
1182 QCOMPARE(child1->pressCount, 1);
1183 QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
1185 QVERIFY(canvas->mouseGrabberItem() == 0);
1186 QCOMPARE(child1->releaseCount, 1);
1188 QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
1190 QVERIFY(canvas->mouseGrabberItem() == child1);
1191 QCOMPARE(child1->pressCount, 2);
1192 child1->setEnabled(false);
1193 QVERIFY(canvas->mouseGrabberItem() == 0);
1194 QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
1196 QCOMPARE(child1->releaseCount, 1);
1197 child1->setEnabled(true);
1199 QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
1201 QVERIFY(canvas->mouseGrabberItem() == child1);
1202 QCOMPARE(child1->pressCount, 3);
1203 child1->setVisible(false);
1204 QVERIFY(canvas->mouseGrabberItem() == 0);
1205 QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
1206 QCOMPARE(child1->releaseCount, 1);
1207 child1->setVisible(true);
1209 QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
1211 QVERIFY(canvas->mouseGrabberItem() == child1);
1212 QCOMPARE(child1->pressCount, 4);
1213 child2->grabMouse();
1214 QVERIFY(canvas->mouseGrabberItem() == child2);
1215 QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
1217 QCOMPARE(child1->releaseCount, 1);
1218 QCOMPARE(child2->releaseCount, 1);
1220 child2->grabMouse();
1221 QVERIFY(canvas->mouseGrabberItem() == child2);
1222 QTest::mousePress(canvas, Qt::LeftButton, 0, QPoint(50,50));
1224 QCOMPARE(child1->pressCount, 4);
1225 QCOMPARE(child2->pressCount, 1);
1226 QTest::mouseRelease(canvas, Qt::LeftButton, 0, QPoint(50,50));
1228 QCOMPARE(child1->releaseCount, 1);
1229 QCOMPARE(child2->releaseCount, 2);
1236 void tst_qquickitem::touchEventAcceptIgnore_data()
1238 QTest::addColumn<bool>("itemSupportsTouch");
1240 QTest::newRow("with touch") << true;
1241 QTest::newRow("without touch") << false;
1244 void tst_qquickitem::touchEventAcceptIgnore()
1246 QFETCH(bool, itemSupportsTouch);
1248 TestCanvas *canvas = new TestCanvas;
1249 canvas->resize(100, 100);
1252 TestItem *item = new TestItem;
1253 item->setSize(QSizeF(100, 100));
1254 item->setParentItem(canvas->rootItem());
1255 item->acceptIncomingTouchEvents = itemSupportsTouch;
1257 static QTouchDevice* device = 0;
1259 device =new QTouchDevice;
1260 device->setType(QTouchDevice::TouchScreen);
1261 QWindowSystemInterface::registerTouchDevice(device);
1264 // Send Begin, Update & End touch sequence
1266 QTouchEvent::TouchPoint point;
1268 point.setPos(QPointF(50, 50));
1269 point.setScreenPos(point.pos());
1270 point.setState(Qt::TouchPointPressed);
1272 QTouchEvent event(QEvent::TouchBegin, device,
1274 Qt::TouchPointPressed,
1275 QList<QTouchEvent::TouchPoint>() << point);
1276 event.setAccepted(true);
1278 item->touchEventReached = false;
1280 bool accepted = canvas->event(&event);
1282 QVERIFY(item->touchEventReached);
1283 QCOMPARE(accepted && event.isAccepted(), itemSupportsTouch);
1286 QTouchEvent::TouchPoint point;
1288 point.setPos(QPointF(60, 60));
1289 point.setScreenPos(point.pos());
1290 point.setState(Qt::TouchPointMoved);
1292 QTouchEvent event(QEvent::TouchUpdate, device,
1294 Qt::TouchPointMoved,
1295 QList<QTouchEvent::TouchPoint>() << point);
1296 event.setAccepted(true);
1298 item->touchEventReached = false;
1300 bool accepted = canvas->event(&event);
1302 QCOMPARE(item->touchEventReached, itemSupportsTouch);
1303 QCOMPARE(accepted && event.isAccepted(), itemSupportsTouch);
1306 QTouchEvent::TouchPoint point;
1308 point.setPos(QPointF(60, 60));
1309 point.setScreenPos(point.pos());
1310 point.setState(Qt::TouchPointReleased);
1312 QTouchEvent event(QEvent::TouchEnd, device,
1314 Qt::TouchPointReleased,
1315 QList<QTouchEvent::TouchPoint>() << point);
1316 event.setAccepted(true);
1318 item->touchEventReached = false;
1320 bool accepted = canvas->event(&event);
1322 QCOMPARE(item->touchEventReached, itemSupportsTouch);
1323 QCOMPARE(accepted && event.isAccepted(), itemSupportsTouch);
1330 void tst_qquickitem::polishOutsideAnimation()
1332 QQuickCanvas *canvas = new QQuickCanvas;
1333 canvas->resize(200, 200);
1336 TestPolishItem *item = new TestPolishItem(canvas->rootItem());
1337 item->setSize(QSizeF(200, 100));
1340 QTimer::singleShot(10, item, SLOT(doPolish()));
1341 QTRY_VERIFY(item->wasPolished);
1347 void tst_qquickitem::polishOnCompleted()
1349 QQuickView *view = new QQuickView;
1350 view->setSource(testFileUrl("polishOnCompleted.qml"));
1353 TestPolishItem *item = qobject_cast<TestPolishItem*>(view->rootObject());
1357 QSKIP("QTBUG-21590 view does not reliably receive polish without a running animation");
1360 QTRY_VERIFY(item->wasPolished);
1365 void tst_qquickitem::wheelEvent_data()
1367 QTest::addColumn<bool>("visible");
1368 QTest::addColumn<bool>("enabled");
1370 QTest::newRow("visible and enabled") << true << true;
1371 QTest::newRow("visible and disabled") << true << false;
1372 QTest::newRow("invisible and enabled") << false << true;
1373 QTest::newRow("invisible and disabled") << false << false;
1376 void tst_qquickitem::wheelEvent()
1378 QFETCH(bool, visible);
1379 QFETCH(bool, enabled);
1381 const bool shouldReceiveWheelEvents = visible && enabled;
1383 QQuickCanvas *canvas = new QQuickCanvas;
1384 canvas->resize(200, 200);
1387 TestItem *item = new TestItem;
1388 item->setSize(QSizeF(200, 100));
1389 item->setParentItem(canvas->rootItem());
1391 item->setEnabled(enabled);
1392 item->setVisible(visible);
1394 QWheelEvent event(QPoint(100, 50), -120, Qt::NoButton, Qt::NoModifier, Qt::Vertical);
1395 event.setAccepted(false);
1396 QGuiApplication::sendEvent(canvas, &event);
1398 if (shouldReceiveWheelEvents) {
1399 QVERIFY(event.isAccepted());
1400 QCOMPARE(item->wheelCount, 1);
1402 QVERIFY(!event.isAccepted());
1403 QCOMPARE(item->wheelCount, 0);
1409 class HoverItem : public QQuickItem
1413 HoverItem(QQuickItem *parent = 0)
1414 : QQuickItem(parent), hoverEnterCount(0), hoverMoveCount(0), hoverLeaveCount(0)
1416 void resetCounters() {
1417 hoverEnterCount = 0;
1419 hoverLeaveCount = 0;
1421 int hoverEnterCount;
1423 int hoverLeaveCount;
1425 virtual void hoverEnterEvent(QHoverEvent *event) {
1429 virtual void hoverMoveEvent(QHoverEvent *event) {
1433 virtual void hoverLeaveEvent(QHoverEvent *event) {
1439 void tst_qquickitem::hoverEvent_data()
1441 QTest::addColumn<bool>("visible");
1442 QTest::addColumn<bool>("enabled");
1443 QTest::addColumn<bool>("acceptHoverEvents");
1445 QTest::newRow("visible, enabled, accept hover") << true << true << true;
1446 QTest::newRow("visible, disabled, accept hover") << true << false << true;
1447 QTest::newRow("invisible, enabled, accept hover") << false << true << true;
1448 QTest::newRow("invisible, disabled, accept hover") << false << false << true;
1450 QTest::newRow("visible, enabled, not accept hover") << true << true << false;
1451 QTest::newRow("visible, disabled, not accept hover") << true << false << false;
1452 QTest::newRow("invisible, enabled, not accept hover") << false << true << false;
1453 QTest::newRow("invisible, disabled, not accept hover") << false << false << false;
1456 // ### For some unknown reason QTest::mouseMove() isn't working correctly.
1457 static void sendMouseMove(QObject *object, const QPoint &position)
1459 QMouseEvent moveEvent(QEvent::MouseMove, position, Qt::NoButton, Qt::NoButton, 0);
1460 QGuiApplication::sendEvent(object, &moveEvent);
1463 void tst_qquickitem::hoverEvent()
1465 QFETCH(bool, visible);
1466 QFETCH(bool, enabled);
1467 QFETCH(bool, acceptHoverEvents);
1469 QQuickCanvas *canvas = new QQuickCanvas();
1470 canvas->resize(200, 200);
1473 HoverItem *item = new HoverItem;
1474 item->setSize(QSizeF(100, 100));
1475 item->setParentItem(canvas->rootItem());
1477 item->setEnabled(enabled);
1478 item->setVisible(visible);
1479 item->setAcceptHoverEvents(acceptHoverEvents);
1481 const QPoint outside(150, 150);
1482 const QPoint inside(50, 50);
1483 const QPoint anotherInside(51, 51);
1485 sendMouseMove(canvas, outside);
1486 item->resetCounters();
1488 // Enter, then move twice inside, then leave.
1489 sendMouseMove(canvas, inside);
1490 sendMouseMove(canvas, anotherInside);
1491 sendMouseMove(canvas, inside);
1492 sendMouseMove(canvas, outside);
1494 const bool shouldReceiveHoverEvents = visible && enabled && acceptHoverEvents;
1495 if (shouldReceiveHoverEvents) {
1496 QCOMPARE(item->hoverEnterCount, 1);
1497 QCOMPARE(item->hoverMoveCount, 2);
1498 QCOMPARE(item->hoverLeaveCount, 1);
1500 QCOMPARE(item->hoverEnterCount, 0);
1501 QCOMPARE(item->hoverMoveCount, 0);
1502 QCOMPARE(item->hoverLeaveCount, 0);
1508 void tst_qquickitem::hoverEventInParent()
1510 QQuickCanvas *canvas = new QQuickCanvas();
1511 canvas->resize(200, 200);
1514 HoverItem *parentItem = new HoverItem(canvas->rootItem());
1515 parentItem->setSize(QSizeF(200, 200));
1516 parentItem->setAcceptHoverEvents(true);
1518 HoverItem *leftItem = new HoverItem(parentItem);
1519 leftItem->setSize(QSizeF(100, 200));
1520 leftItem->setAcceptHoverEvents(true);
1522 HoverItem *rightItem = new HoverItem(parentItem);
1523 rightItem->setSize(QSizeF(100, 200));
1524 rightItem->setPos(QPointF(100, 0));
1525 rightItem->setAcceptHoverEvents(true);
1527 const QPoint insideLeft(50, 100);
1528 const QPoint insideRight(150, 100);
1530 sendMouseMove(canvas, insideLeft);
1531 parentItem->resetCounters();
1532 leftItem->resetCounters();
1533 rightItem->resetCounters();
1535 sendMouseMove(canvas, insideRight);
1536 QCOMPARE(parentItem->hoverEnterCount, 0);
1537 QCOMPARE(parentItem->hoverLeaveCount, 0);
1538 QCOMPARE(leftItem->hoverEnterCount, 0);
1539 QCOMPARE(leftItem->hoverLeaveCount, 1);
1540 QCOMPARE(rightItem->hoverEnterCount, 1);
1541 QCOMPARE(rightItem->hoverLeaveCount, 0);
1543 sendMouseMove(canvas, insideLeft);
1544 QCOMPARE(parentItem->hoverEnterCount, 0);
1545 QCOMPARE(parentItem->hoverLeaveCount, 0);
1546 QCOMPARE(leftItem->hoverEnterCount, 1);
1547 QCOMPARE(leftItem->hoverLeaveCount, 1);
1548 QCOMPARE(rightItem->hoverEnterCount, 1);
1549 QCOMPARE(rightItem->hoverLeaveCount, 1);
1554 void tst_qquickitem::paintOrder_data()
1556 const QUrl order1Url = testFileUrl("order.1.qml");
1557 const QUrl order2Url = testFileUrl("order.2.qml");
1559 QTest::addColumn<QUrl>("source");
1560 QTest::addColumn<int>("op");
1561 QTest::addColumn<QVariant>("param1");
1562 QTest::addColumn<QVariant>("param2");
1563 QTest::addColumn<QStringList>("expected");
1565 QTest::newRow("test 1 noop") << order1Url
1566 << int(NoOp) << QVariant() << QVariant()
1567 << (QStringList() << "1" << "2" << "3");
1568 QTest::newRow("test 1 add") << order1Url
1569 << int(Append) << QVariant("new") << QVariant()
1570 << (QStringList() << "1" << "2" << "3" << "new");
1571 QTest::newRow("test 1 remove") << order1Url
1572 << int(Remove) << QVariant(1) << QVariant()
1573 << (QStringList() << "1" << "3");
1574 QTest::newRow("test 1 stack before") << order1Url
1575 << int(StackBefore) << QVariant(2) << QVariant(1)
1576 << (QStringList() << "1" << "3" << "2");
1577 QTest::newRow("test 1 stack after") << order1Url
1578 << int(StackAfter) << QVariant(0) << QVariant(1)
1579 << (QStringList() << "2" << "1" << "3");
1580 QTest::newRow("test 1 set z") << order1Url
1581 << int(SetZ) << QVariant(1) << QVariant(qreal(1.))
1582 << (QStringList() << "1" << "3" << "2");
1584 QTest::newRow("test 2 noop") << order2Url
1585 << int(NoOp) << QVariant() << QVariant()
1586 << (QStringList() << "1" << "3" << "2");
1587 QTest::newRow("test 2 add") << order2Url
1588 << int(Append) << QVariant("new") << QVariant()
1589 << (QStringList() << "1" << "3" << "new" << "2");
1590 QTest::newRow("test 2 remove 1") << order2Url
1591 << int(Remove) << QVariant(1) << QVariant()
1592 << (QStringList() << "1" << "3");
1593 QTest::newRow("test 2 remove 2") << order2Url
1594 << int(Remove) << QVariant(2) << QVariant()
1595 << (QStringList() << "1" << "2");
1596 QTest::newRow("test 2 stack before 1") << order2Url
1597 << int(StackBefore) << QVariant(1) << QVariant(0)
1598 << (QStringList() << "1" << "3" << "2");
1599 QTest::newRow("test 2 stack before 2") << order2Url
1600 << int(StackBefore) << QVariant(2) << QVariant(0)
1601 << (QStringList() << "3" << "1" << "2");
1602 QTest::newRow("test 2 stack after 1") << order2Url
1603 << int(StackAfter) << QVariant(0) << QVariant(1)
1604 << (QStringList() << "1" << "3" << "2");
1605 QTest::newRow("test 2 stack after 2") << order2Url
1606 << int(StackAfter) << QVariant(0) << QVariant(2)
1607 << (QStringList() << "3" << "1" << "2");
1608 QTest::newRow("test 1 set z") << order1Url
1609 << int(SetZ) << QVariant(2) << QVariant(qreal(2.))
1610 << (QStringList() << "1" << "2" << "3");
1613 void tst_qquickitem::paintOrder()
1615 QFETCH(QUrl, source);
1617 QFETCH(QVariant, param1);
1618 QFETCH(QVariant, param2);
1619 QFETCH(QStringList, expected);
1622 view.setSource(source);
1624 QQuickItem *root = qobject_cast<QQuickItem*>(view.rootObject());
1629 QQuickItem *item = new QQuickItem(root);
1630 item->setObjectName(param1.toString());
1634 QQuickItem *item = root->childItems().at(param1.toInt());
1639 QQuickItem *item1 = root->childItems().at(param1.toInt());
1640 QQuickItem *item2 = root->childItems().at(param2.toInt());
1641 item1->stackBefore(item2);
1645 QQuickItem *item1 = root->childItems().at(param1.toInt());
1646 QQuickItem *item2 = root->childItems().at(param2.toInt());
1647 item1->stackAfter(item2);
1651 QQuickItem *item = root->childItems().at(param1.toInt());
1652 item->setZ(param2.toReal());
1659 QList<QQuickItem*> list = QQuickItemPrivate::get(root)->paintOrderChildItems();
1662 for (int i = 0; i < list.count(); ++i)
1663 items << list.at(i)->objectName();
1665 QCOMPARE(items, expected);
1669 QTEST_MAIN(tst_qquickitem)
1671 #include "tst_qquickitem.moc"