1 /****************************************************************************
3 ** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
4 ** All rights reserved.
5 ** Contact: http://www.qt-project.org/
7 ** This file is part of the test suite of the Qt Toolkit.
9 ** $QT_BEGIN_LICENSE:LGPL$
10 ** GNU Lesser General Public License Usage
11 ** This file may be used under the terms of the GNU Lesser General Public
12 ** License version 2.1 as published by the Free Software Foundation and
13 ** appearing in the file LICENSE.LGPL included in the packaging of this
14 ** file. Please review the following information to ensure the GNU Lesser
15 ** General Public License version 2.1 requirements will be met:
16 ** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
18 ** In addition, as a special exception, Nokia gives you certain additional
19 ** rights. These rights are described in the Nokia Qt LGPL Exception
20 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
22 ** GNU General Public License Usage
23 ** Alternatively, this file may be used under the terms of the GNU General
24 ** Public License version 3.0 as published by the Free Software Foundation
25 ** and appearing in the file LICENSE.GPL included in the packaging of this
26 ** file. Please review the following information to ensure the GNU General
27 ** Public License version 3.0 requirements will be met:
28 ** http://www.gnu.org/copyleft/gpl.html.
31 ** Alternatively, this file may be used in accordance with the terms and
32 ** conditions contained in a signed written agreement between you and Nokia.
40 ****************************************************************************/
42 #include <QtTest/QSignalSpy>
43 #include <QtDeclarative/qdeclarativeengine.h>
44 #include <QtDeclarative/qdeclarativecomponent.h>
45 #include <QtDeclarative/qdeclarativecontext.h>
46 #include <QtQuick/qquickview.h>
47 #include <QtQuick/private/qquickrectangle_p.h>
48 #include <private/qquickitem_p.h>
49 #include "../../shared/util.h"
51 class tst_QQuickItem : public QDeclarativeDataTest
60 void keysProcessingOrder();
62 void keyNavigation_RightToLeft();
63 void keyNavigation_skipNotVisible();
64 void keyNavigation_implicitSetting();
65 void layoutMirroring();
66 void layoutMirroringIllegalParent();
69 void mapCoordinates();
70 void mapCoordinates_data();
71 void propertyChanges();
73 void transforms_data();
75 void childrenRectBug();
76 void childrenRectBug2();
77 void childrenRectBug3();
79 void childrenProperty();
80 void resourcesProperty();
82 void transformCrash();
86 QDeclarativeEngine engine;
90 T *findItem(QQuickItem *parent, const QString &objectName)
95 const QMetaObject &mo = T::staticMetaObject;
96 //qDebug() << parent->QQuickItem::children().count() << "children";
97 for (int i = 0; i < parent->childItems().count(); ++i) {
98 QQuickItem *item = qobject_cast<QQuickItem*>(parent->childItems().at(i));
101 //qDebug() << "try" << item;
102 if (mo.cast(item) && (objectName.isEmpty() || item->objectName() == objectName))
103 return static_cast<T*>(item);
104 item = findItem<T>(item, objectName);
106 return static_cast<T*>(item);
112 class KeysTestObject : public QObject
116 Q_PROPERTY(bool processLast READ processLast NOTIFY processLastChanged)
119 KeysTestObject() : mKey(0), mModifiers(0), mForwardedKey(0), mLast(false) {}
128 bool processLast() const { return mLast; }
129 void setProcessLast(bool b) {
132 emit processLastChanged();
137 void keyPress(int key, QString text, int modifiers) {
140 mModifiers = modifiers;
142 void keyRelease(int key, QString text, int modifiers) {
145 mModifiers = modifiers;
147 void forwardedKey(int key) {
152 void processLastChanged();
164 class KeyTestItem : public QQuickItem
168 KeyTestItem(QQuickItem *parent=0) : QQuickItem(parent), mKey(0) {}
171 void keyPressEvent(QKeyEvent *e) {
174 if (e->key() == Qt::Key_A)
180 void keyReleaseEvent(QKeyEvent *e) {
181 if (e->key() == Qt::Key_B)
191 QML_DECLARE_TYPE(KeyTestItem);
194 tst_QQuickItem::tst_QQuickItem()
198 void tst_QQuickItem::initTestCase()
200 QDeclarativeDataTest::initTestCase();
201 qmlRegisterType<KeyTestItem>("Test",1,0,"KeyTestItem");
204 void tst_QQuickItem::keys()
206 QQuickView *canvas = new QQuickView(0);
207 canvas->setBaseSize(QSize(240,320));
209 KeysTestObject *testObject = new KeysTestObject;
210 canvas->rootContext()->setContextProperty("keysTestObject", testObject);
212 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
213 canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(true));
215 canvas->setSource(testFileUrl("keystest.qml"));
217 canvas->requestActivateWindow();
218 QTest::qWaitForWindowShown(canvas);
219 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
221 QVERIFY(canvas->rootObject());
222 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
224 QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
225 QGuiApplication::sendEvent(canvas, &key);
226 QCOMPARE(testObject->mKey, int(Qt::Key_A));
227 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
228 QCOMPARE(testObject->mText, QLatin1String("A"));
229 QVERIFY(testObject->mModifiers == Qt::NoModifier);
230 QVERIFY(!key.isAccepted());
234 key = QKeyEvent(QEvent::KeyRelease, Qt::Key_A, Qt::ShiftModifier, "A", false, 1);
235 QGuiApplication::sendEvent(canvas, &key);
236 QCOMPARE(testObject->mKey, int(Qt::Key_A));
237 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_A));
238 QCOMPARE(testObject->mText, QLatin1String("A"));
239 QVERIFY(testObject->mModifiers == Qt::ShiftModifier);
240 QVERIFY(key.isAccepted());
244 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
245 QGuiApplication::sendEvent(canvas, &key);
246 QCOMPARE(testObject->mKey, int(Qt::Key_Return));
247 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Return));
248 QCOMPARE(testObject->mText, QLatin1String("Return"));
249 QVERIFY(testObject->mModifiers == Qt::NoModifier);
250 QVERIFY(key.isAccepted());
254 key = QKeyEvent(QEvent::KeyPress, Qt::Key_0, Qt::NoModifier, "0", false, 1);
255 QGuiApplication::sendEvent(canvas, &key);
256 QCOMPARE(testObject->mKey, int(Qt::Key_0));
257 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_0));
258 QCOMPARE(testObject->mText, QLatin1String("0"));
259 QVERIFY(testObject->mModifiers == Qt::NoModifier);
260 QVERIFY(key.isAccepted());
264 key = QKeyEvent(QEvent::KeyPress, Qt::Key_9, Qt::NoModifier, "9", false, 1);
265 QGuiApplication::sendEvent(canvas, &key);
266 QCOMPARE(testObject->mKey, int(Qt::Key_9));
267 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_9));
268 QCOMPARE(testObject->mText, QLatin1String("9"));
269 QVERIFY(testObject->mModifiers == Qt::NoModifier);
270 QVERIFY(!key.isAccepted());
274 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
275 QGuiApplication::sendEvent(canvas, &key);
276 QCOMPARE(testObject->mKey, int(Qt::Key_Tab));
277 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Tab));
278 QCOMPARE(testObject->mText, QLatin1String("Tab"));
279 QVERIFY(testObject->mModifiers == Qt::NoModifier);
280 QVERIFY(key.isAccepted());
284 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
285 QGuiApplication::sendEvent(canvas, &key);
286 QCOMPARE(testObject->mKey, int(Qt::Key_Backtab));
287 QCOMPARE(testObject->mForwardedKey, int(Qt::Key_Backtab));
288 QCOMPARE(testObject->mText, QLatin1String("Backtab"));
289 QVERIFY(testObject->mModifiers == Qt::NoModifier);
290 QVERIFY(key.isAccepted());
294 canvas->rootContext()->setContextProperty("forwardeeVisible", QVariant(false));
295 key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
296 QGuiApplication::sendEvent(canvas, &key);
297 QCOMPARE(testObject->mKey, int(Qt::Key_A));
298 QCOMPARE(testObject->mForwardedKey, 0);
299 QCOMPARE(testObject->mText, QLatin1String("A"));
300 QVERIFY(testObject->mModifiers == Qt::NoModifier);
301 QVERIFY(!key.isAccepted());
305 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(false));
306 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), false);
308 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
309 QGuiApplication::sendEvent(canvas, &key);
310 QCOMPARE(testObject->mKey, 0);
311 QVERIFY(!key.isAccepted());
313 canvas->rootContext()->setContextProperty("enableKeyHanding", QVariant(true));
314 QCOMPARE(canvas->rootObject()->property("isEnabled").toBool(), true);
316 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Return, Qt::NoModifier, "", false, 1);
317 QGuiApplication::sendEvent(canvas, &key);
318 QCOMPARE(testObject->mKey, int(Qt::Key_Return));
319 QVERIFY(key.isAccepted());
325 void tst_QQuickItem::keysProcessingOrder()
327 QQuickView *canvas = new QQuickView(0);
328 canvas->setBaseSize(QSize(240,320));
330 KeysTestObject *testObject = new KeysTestObject;
331 canvas->rootContext()->setContextProperty("keysTestObject", testObject);
333 canvas->setSource(testFileUrl("keyspriority.qml"));
335 canvas->requestActivateWindow();
336 QTest::qWaitForWindowShown(canvas);
337 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
339 KeyTestItem *testItem = qobject_cast<KeyTestItem*>(canvas->rootObject());
342 QKeyEvent key(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
343 QGuiApplication::sendEvent(canvas, &key);
344 QCOMPARE(testObject->mKey, int(Qt::Key_A));
345 QCOMPARE(testObject->mText, QLatin1String("A"));
346 QVERIFY(testObject->mModifiers == Qt::NoModifier);
347 QVERIFY(key.isAccepted());
351 testObject->setProcessLast(true);
353 key = QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::NoModifier, "A", false, 1);
354 QGuiApplication::sendEvent(canvas, &key);
355 QCOMPARE(testObject->mKey, 0);
356 QVERIFY(key.isAccepted());
360 key = QKeyEvent(QEvent::KeyPress, Qt::Key_B, Qt::NoModifier, "B", false, 1);
361 QGuiApplication::sendEvent(canvas, &key);
362 QCOMPARE(testObject->mKey, int(Qt::Key_B));
363 QCOMPARE(testObject->mText, QLatin1String("B"));
364 QVERIFY(testObject->mModifiers == Qt::NoModifier);
365 QVERIFY(!key.isAccepted());
369 key = QKeyEvent(QEvent::KeyRelease, Qt::Key_B, Qt::NoModifier, "B", false, 1);
370 QGuiApplication::sendEvent(canvas, &key);
371 QCOMPARE(testObject->mKey, 0);
372 QVERIFY(key.isAccepted());
378 QQuickItemPrivate *childPrivate(QQuickItem *rootItem, const char * itemString)
380 QQuickItem *item = findItem<QQuickItem>(rootItem, QString(QLatin1String(itemString)));
381 QQuickItemPrivate* itemPrivate = QQuickItemPrivate::get(item);
385 QVariant childProperty(QQuickItem *rootItem, const char * itemString, const char * property)
387 QQuickItem *item = findItem<QQuickItem>(rootItem, QString(QLatin1String(itemString)));
388 return item->property(property);
391 bool anchorsMirrored(QQuickItem *rootItem, const char * itemString)
393 QQuickItem *item = findItem<QQuickItem>(rootItem, QString(QLatin1String(itemString)));
394 QQuickItemPrivate* itemPrivate = QQuickItemPrivate::get(item);
395 return itemPrivate->anchors()->mirrored();
398 void tst_QQuickItem::layoutMirroring()
400 QQuickView *canvas = new QQuickView(0);
401 canvas->setSource(testFileUrl("layoutmirroring.qml"));
404 QQuickItem *rootItem = qobject_cast<QQuickItem*>(canvas->rootObject());
406 QQuickItemPrivate *rootPrivate = QQuickItemPrivate::get(rootItem);
407 QVERIFY(rootPrivate);
409 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
410 QCOMPARE(childPrivate(rootItem, "mirrored2")->effectiveLayoutMirror, true);
411 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
412 QCOMPARE(childPrivate(rootItem, "notMirrored2")->effectiveLayoutMirror, false);
413 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
414 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
416 QCOMPARE(anchorsMirrored(rootItem, "mirrored1"), true);
417 QCOMPARE(anchorsMirrored(rootItem, "mirrored2"), true);
418 QCOMPARE(anchorsMirrored(rootItem, "notMirrored1"), false);
419 QCOMPARE(anchorsMirrored(rootItem, "notMirrored2"), false);
420 QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror1"), true);
421 QCOMPARE(anchorsMirrored(rootItem, "inheritedMirror2"), true);
423 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
424 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritedLayoutMirror, false);
425 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
426 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritedLayoutMirror, false);
427 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
428 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
430 QCOMPARE(childPrivate(rootItem, "mirrored1")->isMirrorImplicit, false);
431 QCOMPARE(childPrivate(rootItem, "mirrored2")->isMirrorImplicit, false);
432 QCOMPARE(childPrivate(rootItem, "notMirrored1")->isMirrorImplicit, false);
433 QCOMPARE(childPrivate(rootItem, "notMirrored2")->isMirrorImplicit, true);
434 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->isMirrorImplicit, true);
435 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->isMirrorImplicit, true);
437 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromParent, true);
438 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromParent, false);
439 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromParent, true);
440 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromParent, false);
441 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromParent, true);
442 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromParent, true);
444 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritMirrorFromItem, true);
445 QCOMPARE(childPrivate(rootItem, "mirrored2")->inheritMirrorFromItem, false);
446 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritMirrorFromItem, false);
447 QCOMPARE(childPrivate(rootItem, "notMirrored2")->inheritMirrorFromItem, false);
448 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritMirrorFromItem, false);
449 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritMirrorFromItem, false);
451 // load dynamic content using Loader that needs to inherit mirroring
452 rootItem->setProperty("state", "newContent");
453 QCOMPARE(childPrivate(rootItem, "notMirrored3")->effectiveLayoutMirror, false);
454 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->effectiveLayoutMirror, true);
456 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritedLayoutMirror, true);
457 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritedLayoutMirror, true);
459 QCOMPARE(childPrivate(rootItem, "notMirrored3")->isMirrorImplicit, false);
460 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->isMirrorImplicit, true);
462 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromParent, true);
463 QCOMPARE(childPrivate(rootItem, "inheritedMirror3")->inheritMirrorFromParent, true);
465 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
466 QCOMPARE(childPrivate(rootItem, "notMirrored3")->inheritMirrorFromItem, false);
468 // disable inheritance
469 rootItem->setProperty("childrenInherit", false);
471 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, false);
472 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, false);
473 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
474 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
476 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, false);
477 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, false);
478 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, false);
479 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, false);
481 // re-enable inheritance
482 rootItem->setProperty("childrenInherit", true);
484 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->effectiveLayoutMirror, true);
485 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->effectiveLayoutMirror, true);
486 QCOMPARE(childPrivate(rootItem, "mirrored1")->effectiveLayoutMirror, true);
487 QCOMPARE(childPrivate(rootItem, "notMirrored1")->effectiveLayoutMirror, false);
489 QCOMPARE(childPrivate(rootItem, "inheritedMirror1")->inheritedLayoutMirror, true);
490 QCOMPARE(childPrivate(rootItem, "inheritedMirror2")->inheritedLayoutMirror, true);
491 QCOMPARE(childPrivate(rootItem, "mirrored1")->inheritedLayoutMirror, true);
492 QCOMPARE(childPrivate(rootItem, "notMirrored1")->inheritedLayoutMirror, true);
497 QQuickItem *parentItem1 = new QQuickItem();
498 QQuickItemPrivate::get(parentItem1)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
499 QQuickItemPrivate::get(parentItem1)->isMirrorImplicit = false;
500 QQuickItemPrivate::get(parentItem1)->inheritMirrorFromItem = true; // LayoutMirroring.childrenInherit: true
501 QQuickItemPrivate::get(parentItem1)->resolveLayoutMirror();
503 // inherit in constructor
504 QQuickItem *childItem1 = new QQuickItem(parentItem1);
505 QCOMPARE(QQuickItemPrivate::get(childItem1)->effectiveLayoutMirror, true);
506 QCOMPARE(QQuickItemPrivate::get(childItem1)->inheritMirrorFromParent, true);
508 // inherit through a parent change
509 QQuickItem *childItem2 = new QQuickItem();
510 QCOMPARE(QQuickItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
511 QCOMPARE(QQuickItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
512 childItem2->setParentItem(parentItem1);
513 QCOMPARE(QQuickItemPrivate::get(childItem2)->effectiveLayoutMirror, true);
514 QCOMPARE(QQuickItemPrivate::get(childItem2)->inheritMirrorFromParent, true);
516 // stop inherting through a parent change
517 QQuickItem *parentItem2 = new QQuickItem();
518 QQuickItemPrivate::get(parentItem2)->effectiveLayoutMirror = true; // LayoutMirroring.enabled: true
519 QQuickItemPrivate::get(parentItem2)->resolveLayoutMirror();
520 childItem2->setParentItem(parentItem2);
521 QCOMPARE(QQuickItemPrivate::get(childItem2)->effectiveLayoutMirror, false);
522 QCOMPARE(QQuickItemPrivate::get(childItem2)->inheritMirrorFromParent, false);
528 void tst_QQuickItem::layoutMirroringIllegalParent()
530 QDeclarativeComponent component(&engine);
531 component.setData("import QtQuick 2.0; QtObject { LayoutMirroring.enabled: true; LayoutMirroring.childrenInherit: true }", QUrl::fromLocalFile(""));
532 QTest::ignoreMessage(QtWarningMsg, "file::1:21: QML QtObject: LayoutDirection attached property only works with Items");
533 QObject *object = component.create();
534 QVERIFY(object != 0);
537 void tst_QQuickItem::keyNavigation()
539 QQuickView *canvas = new QQuickView(0);
540 canvas->setBaseSize(QSize(240,320));
542 canvas->setSource(testFileUrl("keynavigationtest.qml"));
544 canvas->requestActivateWindow();
545 QTest::qWaitForWindowShown(canvas);
546 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
548 QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item1");
550 QVERIFY(item->hasActiveFocus());
553 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
554 Q_RETURN_ARG(QVariant, result)));
555 QVERIFY(result.toBool());
558 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
559 QGuiApplication::sendEvent(canvas, &key);
560 QVERIFY(key.isAccepted());
562 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
564 QVERIFY(item->hasActiveFocus());
567 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
568 QGuiApplication::sendEvent(canvas, &key);
569 QVERIFY(key.isAccepted());
571 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
573 QVERIFY(item->hasActiveFocus());
576 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
577 QGuiApplication::sendEvent(canvas, &key);
578 QVERIFY(key.isAccepted());
580 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
582 QVERIFY(item->hasActiveFocus());
585 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
586 QGuiApplication::sendEvent(canvas, &key);
587 QVERIFY(key.isAccepted());
589 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
591 QVERIFY(item->hasActiveFocus());
594 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
595 QGuiApplication::sendEvent(canvas, &key);
596 QVERIFY(key.isAccepted());
598 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
600 QVERIFY(item->hasActiveFocus());
603 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
604 QGuiApplication::sendEvent(canvas, &key);
605 QVERIFY(key.isAccepted());
607 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
609 QVERIFY(item->hasActiveFocus());
614 void tst_QQuickItem::keyNavigation_RightToLeft()
616 QQuickView *canvas = new QQuickView(0);
617 canvas->setBaseSize(QSize(240,320));
619 canvas->setSource(testFileUrl("keynavigationtest.qml"));
621 canvas->requestActivateWindow();
622 QTest::qWaitForWindowShown(canvas);
623 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
625 QQuickItem *rootItem = qobject_cast<QQuickItem*>(canvas->rootObject());
627 QQuickItemPrivate* rootItemPrivate = QQuickItemPrivate::get(rootItem);
629 rootItemPrivate->effectiveLayoutMirror = true; // LayoutMirroring.mirror: true
630 rootItemPrivate->isMirrorImplicit = false;
631 rootItemPrivate->inheritMirrorFromItem = true; // LayoutMirroring.inherit: true
632 rootItemPrivate->resolveLayoutMirror();
634 QEvent wa(QEvent::WindowActivate);
635 QGuiApplication::sendEvent(canvas, &wa);
636 QFocusEvent fe(QEvent::FocusIn);
637 QGuiApplication::sendEvent(canvas, &fe);
639 QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item1");
641 QVERIFY(item->hasActiveFocus());
644 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
645 Q_RETURN_ARG(QVariant, result)));
646 QVERIFY(result.toBool());
649 QKeyEvent key(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
650 QGuiApplication::sendEvent(canvas, &key);
651 QVERIFY(key.isAccepted());
653 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
655 QVERIFY(item->hasActiveFocus());
658 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
659 QGuiApplication::sendEvent(canvas, &key);
660 QVERIFY(key.isAccepted());
662 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
664 QVERIFY(item->hasActiveFocus());
669 void tst_QQuickItem::keyNavigation_skipNotVisible()
671 QQuickView *canvas = new QQuickView(0);
672 canvas->setBaseSize(QSize(240,320));
674 canvas->setSource(testFileUrl("keynavigationtest.qml"));
676 canvas->requestActivateWindow();
677 QTest::qWaitForWindowShown(canvas);
678 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
680 QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item1");
682 QVERIFY(item->hasActiveFocus());
684 // Set item 2 to not visible
685 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
687 item->setVisible(false);
688 QVERIFY(!item->isVisible());
691 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
692 QGuiApplication::sendEvent(canvas, &key);
693 QVERIFY(key.isAccepted());
695 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
697 QVERIFY(item->hasActiveFocus());
700 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
701 QGuiApplication::sendEvent(canvas, &key);
702 QVERIFY(key.isAccepted());
704 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
706 QVERIFY(item->hasActiveFocus());
709 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
710 QGuiApplication::sendEvent(canvas, &key);
711 QVERIFY(key.isAccepted());
713 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
715 QVERIFY(item->hasActiveFocus());
717 //Set item 3 to not visible
718 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
720 item->setVisible(false);
721 QVERIFY(!item->isVisible());
724 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
725 QGuiApplication::sendEvent(canvas, &key);
726 QVERIFY(key.isAccepted());
728 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
730 QVERIFY(item->hasActiveFocus());
733 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
734 QGuiApplication::sendEvent(canvas, &key);
735 QVERIFY(key.isAccepted());
737 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
739 QVERIFY(item->hasActiveFocus());
744 void tst_QQuickItem::keyNavigation_implicitSetting()
746 QQuickView *canvas = new QQuickView(0);
747 canvas->setBaseSize(QSize(240,320));
749 canvas->setSource(testFileUrl("keynavigationtest_implicit.qml"));
751 canvas->requestActivateWindow();
752 QTest::qWaitForWindowShown(canvas);
753 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
755 QEvent wa(QEvent::WindowActivate);
756 QGuiApplication::sendEvent(canvas, &wa);
757 QFocusEvent fe(QEvent::FocusIn);
758 QGuiApplication::sendEvent(canvas, &fe);
760 QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item1");
762 QVERIFY(item->hasActiveFocus());
765 QVERIFY(QMetaObject::invokeMethod(canvas->rootObject(), "verify",
766 Q_RETURN_ARG(QVariant, result)));
767 QVERIFY(result.toBool());
770 QKeyEvent key(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
771 QGuiApplication::sendEvent(canvas, &key);
772 QVERIFY(key.isAccepted());
774 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
776 QVERIFY(item->hasActiveFocus());
779 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
780 QGuiApplication::sendEvent(canvas, &key);
781 QVERIFY(key.isAccepted());
783 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
785 QVERIFY(item->hasActiveFocus());
788 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
789 QGuiApplication::sendEvent(canvas, &key);
790 QVERIFY(key.isAccepted());
792 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
794 QVERIFY(item->hasActiveFocus());
797 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
798 QGuiApplication::sendEvent(canvas, &key);
799 QVERIFY(key.isAccepted());
801 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
803 QVERIFY(item->hasActiveFocus());
806 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Left, Qt::NoModifier, "", false, 1);
807 QGuiApplication::sendEvent(canvas, &key);
808 QVERIFY(key.isAccepted());
810 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
812 QVERIFY(item->hasActiveFocus());
815 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1);
816 QGuiApplication::sendEvent(canvas, &key);
817 QVERIFY(key.isAccepted());
819 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
821 QVERIFY(item->hasActiveFocus());
824 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Up, Qt::NoModifier, "", false, 1);
825 QGuiApplication::sendEvent(canvas, &key);
826 QVERIFY(key.isAccepted());
828 item = findItem<QQuickItem>(canvas->rootObject(), "item2");
830 QVERIFY(item->hasActiveFocus());
833 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Down, Qt::NoModifier, "", false, 1);
834 QGuiApplication::sendEvent(canvas, &key);
835 QVERIFY(key.isAccepted());
837 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
839 QVERIFY(item->hasActiveFocus());
842 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1);
843 QGuiApplication::sendEvent(canvas, &key);
844 QVERIFY(key.isAccepted());
846 item = findItem<QQuickItem>(canvas->rootObject(), "item1");
848 QVERIFY(item->hasActiveFocus());
851 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
852 QGuiApplication::sendEvent(canvas, &key);
853 QVERIFY(key.isAccepted());
855 item = findItem<QQuickItem>(canvas->rootObject(), "item4");
857 QVERIFY(item->hasActiveFocus());
860 key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1);
861 QGuiApplication::sendEvent(canvas, &key);
862 QVERIFY(key.isAccepted());
864 item = findItem<QQuickItem>(canvas->rootObject(), "item3");
866 QVERIFY(item->hasActiveFocus());
871 void tst_QQuickItem::smooth()
873 QDeclarativeComponent component(&engine);
874 component.setData("import QtQuick 2.0; Item { smooth: false; }", QUrl::fromLocalFile(""));
875 QQuickItem *item = qobject_cast<QQuickItem*>(component.create());
876 QSignalSpy spy(item, SIGNAL(smoothChanged(bool)));
879 QVERIFY(!item->smooth());
881 item->setSmooth(true);
882 QVERIFY(item->smooth());
883 QCOMPARE(spy.count(),1);
884 QList<QVariant> arguments = spy.first();
885 QVERIFY(arguments.count() == 1);
886 QVERIFY(arguments.at(0).toBool() == true);
888 item->setSmooth(true);
889 QCOMPARE(spy.count(),1);
891 item->setSmooth(false);
892 QVERIFY(!item->smooth());
893 QCOMPARE(spy.count(),2);
894 item->setSmooth(false);
895 QCOMPARE(spy.count(),2);
900 void tst_QQuickItem::clip()
902 QDeclarativeComponent component(&engine);
903 component.setData("import QtQuick 2.0\nItem { clip: false\n }", QUrl::fromLocalFile(""));
904 QQuickItem *item = qobject_cast<QQuickItem*>(component.create());
905 QSignalSpy spy(item, SIGNAL(clipChanged(bool)));
908 QVERIFY(!item->clip());
911 QVERIFY(item->clip());
913 QList<QVariant> arguments = spy.first();
914 QVERIFY(arguments.count() == 1);
915 QVERIFY(arguments.at(0).toBool() == true);
917 QCOMPARE(spy.count(),1);
919 QCOMPARE(spy.count(),1);
921 item->setClip(false);
922 QVERIFY(!item->clip());
923 QCOMPARE(spy.count(),2);
924 item->setClip(false);
925 QCOMPARE(spy.count(),2);
930 void tst_QQuickItem::mapCoordinates()
935 QQuickView *canvas = new QQuickView(0);
936 canvas->setBaseSize(QSize(300, 300));
937 canvas->setSource(testFileUrl("mapCoordinates.qml"));
939 qApp->processEvents();
941 QQuickItem *root = qobject_cast<QQuickItem*>(canvas->rootObject());
943 QQuickItem *a = findItem<QQuickItem>(canvas->rootObject(), "itemA");
945 QQuickItem *b = findItem<QQuickItem>(canvas->rootObject(), "itemB");
950 QVERIFY(QMetaObject::invokeMethod(root, "mapAToB",
951 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
952 QCOMPARE(result.value<QPointF>(), qobject_cast<QQuickItem*>(a)->mapToItem(b, QPointF(x, y)));
954 QVERIFY(QMetaObject::invokeMethod(root, "mapAFromB",
955 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
956 QCOMPARE(result.value<QPointF>(), qobject_cast<QQuickItem*>(a)->mapFromItem(b, QPointF(x, y)));
958 QVERIFY(QMetaObject::invokeMethod(root, "mapAToNull",
959 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
960 QCOMPARE(result.value<QPointF>(), qobject_cast<QQuickItem*>(a)->mapToScene(QPointF(x, y)));
962 QVERIFY(QMetaObject::invokeMethod(root, "mapAFromNull",
963 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
964 QCOMPARE(result.value<QPointF>(), qobject_cast<QQuickItem*>(a)->mapFromScene(QPointF(x, y)));
966 QString warning1 = testFileUrl("mapCoordinates.qml").toString() + ":48:5: QML Item: mapToItem() given argument \"1122\" which is neither null nor an Item";
967 QString warning2 = testFileUrl("mapCoordinates.qml").toString() + ":48:5: QML Item: mapFromItem() given argument \"1122\" which is neither null nor an Item";
969 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
970 QVERIFY(QMetaObject::invokeMethod(root, "checkMapAToInvalid",
971 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
972 QVERIFY(result.toBool());
974 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
975 QVERIFY(QMetaObject::invokeMethod(root, "checkMapAFromInvalid",
976 Q_RETURN_ARG(QVariant, result), Q_ARG(QVariant, x), Q_ARG(QVariant, y)));
977 QVERIFY(result.toBool());
982 void tst_QQuickItem::mapCoordinates_data()
984 QTest::addColumn<int>("x");
985 QTest::addColumn<int>("y");
987 for (int i=-20; i<=20; i+=10)
988 QTest::newRow(QTest::toString(i)) << i << i;
991 void tst_QQuickItem::transforms_data()
993 QTest::addColumn<QByteArray>("qml");
994 QTest::addColumn<QTransform>("transform");
995 QTest::newRow("translate") << QByteArray("Translate { x: 10; y: 20 }")
996 << QTransform(1,0,0,0,1,0,10,20,1);
997 QTest::newRow("rotation") << QByteArray("Rotation { angle: 90 }")
998 << QTransform(0,1,0,-1,0,0,0,0,1);
999 QTest::newRow("scale") << QByteArray("Scale { xScale: 1.5; yScale: -2 }")
1000 << QTransform(1.5,0,0,0,-2,0,0,0,1);
1001 QTest::newRow("sequence") << QByteArray("[ Translate { x: 10; y: 20 }, Scale { xScale: 1.5; yScale: -2 } ]")
1002 << QTransform(1,0,0,0,1,0,10,20,1) * QTransform(1.5,0,0,0,-2,0,0,0,1);
1005 void tst_QQuickItem::transforms()
1007 QFETCH(QByteArray, qml);
1008 QFETCH(QTransform, transform);
1009 QDeclarativeComponent component(&engine);
1010 component.setData("import QtQuick 2.0\nItem { transform: "+qml+"}", QUrl::fromLocalFile(""));
1011 QQuickItem *item = qobject_cast<QQuickItem*>(component.create());
1013 QCOMPARE(item->itemTransform(0,0), transform);
1016 void tst_QQuickItem::childrenProperty()
1018 QDeclarativeComponent component(&engine, testFileUrl("childrenProperty.qml"));
1020 QObject *o = component.create();
1023 QCOMPARE(o->property("test1").toBool(), true);
1024 QCOMPARE(o->property("test2").toBool(), true);
1025 QCOMPARE(o->property("test3").toBool(), true);
1026 QCOMPARE(o->property("test4").toBool(), true);
1027 QCOMPARE(o->property("test5").toBool(), true);
1031 void tst_QQuickItem::resourcesProperty()
1033 QDeclarativeComponent component(&engine, testFileUrl("resourcesProperty.qml"));
1035 QObject *o = component.create();
1038 QCOMPARE(o->property("test1").toBool(), true);
1039 QCOMPARE(o->property("test2").toBool(), true);
1040 QCOMPARE(o->property("test3").toBool(), true);
1041 QCOMPARE(o->property("test4").toBool(), true);
1042 QCOMPARE(o->property("test5").toBool(), true);
1046 void tst_QQuickItem::propertyChanges()
1048 QQuickView *canvas = new QQuickView(0);
1049 canvas->setBaseSize(QSize(300, 300));
1050 canvas->setSource(testFileUrl("propertychanges.qml"));
1052 canvas->requestActivateWindow();
1053 QTest::qWaitForWindowShown(canvas);
1054 QTRY_VERIFY(QGuiApplication::focusWindow() == canvas);
1056 QQuickItem *item = findItem<QQuickItem>(canvas->rootObject(), "item");
1057 QQuickItem *parentItem = findItem<QQuickItem>(canvas->rootObject(), "parentItem");
1060 QVERIFY(parentItem);
1062 QSignalSpy parentSpy(item, SIGNAL(parentChanged(QQuickItem *)));
1063 QSignalSpy widthSpy(item, SIGNAL(widthChanged()));
1064 QSignalSpy heightSpy(item, SIGNAL(heightChanged()));
1065 QSignalSpy baselineOffsetSpy(item, SIGNAL(baselineOffsetChanged(qreal)));
1066 QSignalSpy childrenRectSpy(parentItem, SIGNAL(childrenRectChanged(QRectF)));
1067 QSignalSpy focusSpy(item, SIGNAL(focusChanged(bool)));
1068 QSignalSpy wantsFocusSpy(parentItem, SIGNAL(activeFocusChanged(bool)));
1069 QSignalSpy childrenChangedSpy(parentItem, SIGNAL(childrenChanged()));
1070 QSignalSpy xSpy(item, SIGNAL(xChanged()));
1071 QSignalSpy ySpy(item, SIGNAL(yChanged()));
1073 item->setParentItem(parentItem);
1074 item->setWidth(100.0);
1075 item->setHeight(200.0);
1076 item->setFocus(true);
1077 item->setBaselineOffset(10.0);
1079 QCOMPARE(item->parentItem(), parentItem);
1080 QCOMPARE(parentSpy.count(),1);
1081 QList<QVariant> parentArguments = parentSpy.first();
1082 QVERIFY(parentArguments.count() == 1);
1083 QCOMPARE(item->parentItem(), qvariant_cast<QQuickItem *>(parentArguments.at(0)));
1084 QCOMPARE(childrenChangedSpy.count(),1);
1086 item->setParentItem(parentItem);
1087 QCOMPARE(childrenChangedSpy.count(),1);
1089 QCOMPARE(item->width(), 100.0);
1090 QCOMPARE(widthSpy.count(),1);
1092 QCOMPARE(item->height(), 200.0);
1093 QCOMPARE(heightSpy.count(),1);
1095 QCOMPARE(item->baselineOffset(), 10.0);
1096 QCOMPARE(baselineOffsetSpy.count(),1);
1097 QList<QVariant> baselineOffsetArguments = baselineOffsetSpy.first();
1098 QVERIFY(baselineOffsetArguments.count() == 1);
1099 QCOMPARE(item->baselineOffset(), baselineOffsetArguments.at(0).toReal());
1101 QCOMPARE(parentItem->childrenRect(), QRectF(0.0,0.0,100.0,200.0));
1102 QCOMPARE(childrenRectSpy.count(),1);
1103 QList<QVariant> childrenRectArguments = childrenRectSpy.at(0);
1104 QVERIFY(childrenRectArguments.count() == 1);
1105 QCOMPARE(parentItem->childrenRect(), childrenRectArguments.at(0).toRectF());
1107 QCOMPARE(item->hasActiveFocus(), true);
1108 QCOMPARE(focusSpy.count(),1);
1109 QList<QVariant> focusArguments = focusSpy.first();
1110 QVERIFY(focusArguments.count() == 1);
1111 QCOMPARE(focusArguments.at(0).toBool(), true);
1113 QCOMPARE(parentItem->hasActiveFocus(), false);
1114 QCOMPARE(parentItem->hasFocus(), false);
1115 QCOMPARE(wantsFocusSpy.count(),0);
1118 QCOMPARE(item->x(), 10.0);
1119 QCOMPARE(xSpy.count(), 1);
1122 QCOMPARE(item->y(), 10.0);
1123 QCOMPARE(ySpy.count(), 1);
1128 void tst_QQuickItem::childrenRect()
1130 QQuickView *canvas = new QQuickView(0);
1131 canvas->setSource(testFileUrl("childrenRect.qml"));
1132 canvas->setBaseSize(QSize(240,320));
1135 QQuickItem *o = canvas->rootObject();
1136 QQuickItem *item = o->findChild<QQuickItem*>("testItem");
1137 QCOMPARE(item->width(), qreal(0));
1138 QCOMPARE(item->height(), qreal(0));
1140 o->setProperty("childCount", 1);
1141 QCOMPARE(item->width(), qreal(10));
1142 QCOMPARE(item->height(), qreal(20));
1144 o->setProperty("childCount", 5);
1145 QCOMPARE(item->width(), qreal(50));
1146 QCOMPARE(item->height(), qreal(100));
1148 o->setProperty("childCount", 0);
1149 QCOMPARE(item->width(), qreal(0));
1150 QCOMPARE(item->height(), qreal(0));
1157 void tst_QQuickItem::childrenRectBug()
1159 QQuickView *canvas = new QQuickView(0);
1161 QString warning = testFileUrl("childrenRectBug.qml").toString() + ":7:5: QML Item: Binding loop detected for property \"height\"";
1162 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
1163 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning));
1165 canvas->setSource(testFileUrl("childrenRectBug.qml"));
1168 QQuickItem *o = canvas->rootObject();
1169 QQuickItem *item = o->findChild<QQuickItem*>("theItem");
1170 QCOMPARE(item->width(), qreal(200));
1171 QCOMPARE(item->height(), qreal(100));
1172 QCOMPARE(item->x(), qreal(100));
1178 void tst_QQuickItem::childrenRectBug2()
1180 QQuickView *canvas = new QQuickView(0);
1182 QString warning1 = testFileUrl("childrenRectBug2.qml").toString() + ":7:5: QML Item: Binding loop detected for property \"width\"";
1183 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
1184 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning1));
1186 QString warning2 = testFileUrl("childrenRectBug2.qml").toString() + ":7:5: QML Item: Binding loop detected for property \"height\"";
1187 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1188 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1189 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1190 QTest::ignoreMessage(QtWarningMsg, qPrintable(warning2));
1192 canvas->setSource(testFileUrl("childrenRectBug2.qml"));
1195 QQuickRectangle *rect = qobject_cast<QQuickRectangle*>(canvas->rootObject());
1197 QQuickItem *item = rect->findChild<QQuickItem*>("theItem");
1198 QCOMPARE(item->width(), qreal(100));
1199 QCOMPARE(item->height(), qreal(110));
1200 QCOMPARE(item->x(), qreal(130));
1202 QQuickItemPrivate *rectPrivate = QQuickItemPrivate::get(rect);
1203 rectPrivate->setState("row");
1204 QCOMPARE(item->width(), qreal(210));
1205 QCOMPARE(item->height(), qreal(50));
1206 QCOMPARE(item->x(), qreal(75));
1212 void tst_QQuickItem::childrenRectBug3()
1214 QQuickView *canvas = new QQuickView(0);
1215 canvas->setSource(testFileUrl("childrenRectBug3.qml"));
1218 //don't crash on delete
1223 void tst_QQuickItem::transformCrash()
1225 QQuickView *canvas = new QQuickView(0);
1226 canvas->setSource(testFileUrl("transformCrash.qml"));
1232 void tst_QQuickItem::implicitSize()
1234 QQuickView *canvas = new QQuickView(0);
1235 canvas->setSource(testFileUrl("implicitsize.qml"));
1238 QQuickItem *item = qobject_cast<QQuickItem*>(canvas->rootObject());
1240 QCOMPARE(item->width(), qreal(80));
1241 QCOMPARE(item->height(), qreal(60));
1243 QCOMPARE(item->implicitWidth(), qreal(200));
1244 QCOMPARE(item->implicitHeight(), qreal(100));
1246 QMetaObject::invokeMethod(item, "resetSize");
1248 QCOMPARE(item->width(), qreal(200));
1249 QCOMPARE(item->height(), qreal(100));
1251 QMetaObject::invokeMethod(item, "changeImplicit");
1253 QCOMPARE(item->implicitWidth(), qreal(150));
1254 QCOMPARE(item->implicitHeight(), qreal(80));
1255 QCOMPARE(item->width(), qreal(150));
1256 QCOMPARE(item->height(), qreal(80));
1261 void tst_QQuickItem::qtbug_16871()
1263 QDeclarativeComponent component(&engine, testFileUrl("qtbug_16871.qml"));
1264 QObject *o = component.create();
1269 QTEST_MAIN(tst_QQuickItem)
1271 #include "tst_qquickitem.moc"