diff options
-rw-r--r-- | src/quick/items/qquickrendercontrol.cpp | 30 | ||||
-rw-r--r-- | src/quick/items/qquickrendercontrol_p.h | 2 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 24 |
3 files changed, 51 insertions, 5 deletions
diff --git a/src/quick/items/qquickrendercontrol.cpp b/src/quick/items/qquickrendercontrol.cpp index d919ae9a0f..e2a26836cf 100644 --- a/src/quick/items/qquickrendercontrol.cpp +++ b/src/quick/items/qquickrendercontrol.cpp @@ -245,4 +245,34 @@ QQuickWindow *QQuickRenderControl::window() const return d->window; } +/*! + \fn QWindow *QQuickRenderControl::renderWindow(QPoint *offset) + + Reimplemented in subclasses to return the real window this render control + is rendering into. + + If \a offset in non-null, it is set to the offset of the control + inside the window. +*/ + +/*! + Returns the real window that \a win is being rendered to, if any. + + If \a offset in non-null, it is set to the offset of the rendering + inside its window. + + */ + +QWindow *QQuickRenderControl::renderWindowFor(QQuickWindow *win, QPoint *offset) +{ + if (!win) + return 0; + QQuickRenderControl *rc = QQuickWindowPrivate::get(win)->renderControl; + if (rc) + return rc->renderWindow(offset); + return 0; +} + + + QT_END_NAMESPACE diff --git a/src/quick/items/qquickrendercontrol_p.h b/src/quick/items/qquickrendercontrol_p.h index 98dc946303..4cc2cf1252 100644 --- a/src/quick/items/qquickrendercontrol_p.h +++ b/src/quick/items/qquickrendercontrol_p.h @@ -63,6 +63,8 @@ public: ~QQuickRenderControl(); QQuickWindow *window() const; + virtual QWindow *renderWindow(QPoint */*offset*/) { return 0; } + static QWindow *renderWindowFor(QQuickWindow *win, QPoint *offset = 0); void windowDestroyed(); diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index e71da7e7ec..b6d72ac21d 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -66,10 +66,29 @@ QT_BEGIN_NAMESPACE extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha); +class QQuickWidgetRenderControl : public QQuickRenderControl +{ +public: + QQuickWidgetRenderControl(QQuickWidget *quickwidget) : m_quickWidget(quickwidget) {} + QWindow *renderWindow(QPoint *offset) { + if (offset) + *offset = m_quickWidget->mapTo(m_quickWidget->window(), QPoint()); + return m_quickWidget->window()->windowHandle(); + } +private: + QQuickWidget *m_quickWidget; +}; + void QQuickWidgetPrivate::init(QQmlEngine* e) { Q_Q(QQuickWidget); + renderControl = new QQuickWidgetRenderControl(q); + offscreenWindow = new QQuickWindow(renderControl); + offscreenWindow->setTitle(QString::fromLatin1("Offscreen")); + // Do not call create() on offscreenWindow. + createOffscreenSurface(); + setRenderToTexture(); engine = e; @@ -108,11 +127,6 @@ QQuickWidgetPrivate::QQuickWidgetPrivate() , updatePending(false) , fakeHidden(false) { - renderControl = new QQuickRenderControl; - offscreenWindow = new QQuickWindow(renderControl); - offscreenWindow->setTitle(QString::fromLatin1("Offscreen")); - // Do not call create() on offscreenWindow. - createOffscreenSurface(); } QQuickWidgetPrivate::~QQuickWidgetPrivate() |