From a1eb1348ff8026a6c623981d06142769dc18ec78 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete Date: Wed, 23 Apr 2014 09:58:32 +0200 Subject: Getting the render window of an offscreen window When using a QQuickWidget, the QQuickWindow is hidden and the contents are displayed in another window. Some components need to query the actual window, e.g. when positioning a popup. Task-number: QTBUG-38116 Change-Id: I34452be2179ccc9e216e4d89264dc700e0cf42a0 Reviewed-by: Gunnar Sletta --- src/quick/items/qquickrendercontrol.cpp | 30 ++++++++++++++++++++++++++++++ src/quick/items/qquickrendercontrol_p.h | 2 ++ 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() -- cgit v1.2.3