From f70066e95e7e23562155686cb7d7874b2d5da5a1 Mon Sep 17 00:00:00 2001 From: Oleg Yadrov Date: Tue, 20 Dec 2016 16:45:20 -0800 Subject: Make it possible to call grabToImage() on Window.contentItem Window.contentItem was not associated with any QQmlContext and QQmlEngine. A valid pointer to QQmlEngine is needed for callback function execution. Task-number: QTBUG-57175 Change-Id: Iab7730bfc8860521ff2e8c1631a11d0e1fe0cf94 Reviewed-by: Shawn Rutledge --- src/quick/items/qquickview.cpp | 2 ++ src/quick/items/qquickwindowmodule.cpp | 3 +++ .../qquickwindow/data/grabContentItemToImage.qml | 15 +++++++++++++++ tests/auto/quick/qquickwindow/qquickwindow.pro | 3 ++- tests/auto/quick/qquickwindow/tst_qquickwindow.cpp | 19 +++++++++++++++++++ 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 tests/auto/quick/qquickwindow/data/grabContentItemToImage.qml diff --git a/src/quick/items/qquickview.cpp b/src/quick/items/qquickview.cpp index 573440ff7f..d7171bf910 100644 --- a/src/quick/items/qquickview.cpp +++ b/src/quick/items/qquickview.cpp @@ -62,6 +62,8 @@ void QQuickViewPrivate::init(QQmlEngine* e) if (engine.isNull()) engine = new QQmlEngine(q); + QQmlEngine::setContextForObject(contentItem, engine.data()->rootContext()); + if (!engine.data()->incubationController()) engine.data()->setIncubationController(q->incubationController()); diff --git a/src/quick/items/qquickwindowmodule.cpp b/src/quick/items/qquickwindowmodule.cpp index ea1fc2f106..42313e4584 100644 --- a/src/quick/items/qquickwindowmodule.cpp +++ b/src/quick/items/qquickwindowmodule.cpp @@ -102,6 +102,9 @@ void QQuickWindowQmlImpl::classBegin() { Q_D(QQuickWindowQmlImpl); QQmlEngine* e = qmlEngine(this); + + QQmlEngine::setContextForObject(contentItem(), e->rootContext()); + //Give QQuickView behavior when created from QML with QQmlApplicationEngine if (QCoreApplication::instance()->property("__qml_using_qqmlapplicationengine") == QVariant(true)) { if (e && !e->incubationController()) diff --git a/tests/auto/quick/qquickwindow/data/grabContentItemToImage.qml b/tests/auto/quick/qquickwindow/data/grabContentItemToImage.qml new file mode 100644 index 0000000000..9086e0cc84 --- /dev/null +++ b/tests/auto/quick/qquickwindow/data/grabContentItemToImage.qml @@ -0,0 +1,15 @@ +import QtQuick 2.0 +import QtQuick.Window 2.2 as Window + +Window.Window { + visible: true + width: 100 + height: 100 + property int success: 0 + + function grabContentItemToImage() { + contentItem.grabToImage(function (image) { + success = 1 + }) + } +} diff --git a/tests/auto/quick/qquickwindow/qquickwindow.pro b/tests/auto/quick/qquickwindow/qquickwindow.pro index 05093ba8e0..b0a5f97a32 100644 --- a/tests/auto/quick/qquickwindow/qquickwindow.pro +++ b/tests/auto/quick/qquickwindow/qquickwindow.pro @@ -16,4 +16,5 @@ OTHER_FILES += \ data/AnimationsWhileHidden.qml \ data/Headless.qml \ data/showHideAnimate.qml \ - data/windoworder.qml + data/windoworder.qml \ + data/grabContentItemToImage.qml diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp index 300ca392f9..dd00154935 100644 --- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp +++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp @@ -370,6 +370,8 @@ private slots: void pointerEventTypeAndPointCount(); + void grabContentItemToImage(); + private: QTouchDevice *touchDevice; QTouchDevice *touchDeviceWithVelocity; @@ -2554,6 +2556,23 @@ void tst_qquickwindow::pointerEventTypeAndPointCount() QVERIFY(!pte.touchPointById(0)); } +void tst_qquickwindow::grabContentItemToImage() +{ + QQmlEngine engine; + QQmlComponent component(&engine); + component.loadUrl(testFileUrl("grabContentItemToImage.qml")); + + QObject *created = component.create(); + QScopedPointer cleanup(created); + QVERIFY(created); + + QQuickWindow *window = qobject_cast(created); + QVERIFY(QTest::qWaitForWindowActive(window)); + + QMetaObject::invokeMethod(window, "grabContentItemToImage"); + QTRY_COMPARE(created->property("success").toInt(), 1); +} + QTEST_MAIN(tst_qquickwindow) #include "tst_qquickwindow.moc" -- cgit v1.2.3