diff options
author | Paul Olav Tvete <paul.tvete@digia.com> | 2014-04-23 09:58:32 +0200 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-04-24 15:36:51 +0200 |
commit | a1eb1348ff8026a6c623981d06142769dc18ec78 (patch) | |
tree | 52f2c1924600a65c5fb828b00d7a3e2641ba0102 /src | |
parent | 4f3a02c7cde6589ecbdbc4f0dcf20793d2d604db (diff) |
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 <gunnar.sletta@jollamobile.com>
Diffstat (limited to 'src')
-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() |