diff options
| author | Laszlo Agocs <laszlo.agocs@qt.io> | 2021-06-14 16:13:21 +0200 |
|---|---|---|
| committer | Laszlo Agocs <laszlo.agocs@qt.io> | 2021-06-15 11:12:21 +0200 |
| commit | d3412cddab1ca2ed47ed3862d5d7e0a065e64b86 (patch) | |
| tree | 6f4cf25cd9e738461c6331d5b6f6381d59d1d120 | |
| parent | 6dfed1ee9c8e03780b222a71f6b90fe2016d8994 (diff) | |
| download | qtdeclarative-d3412cddab1ca2ed47ed3862d5d7e0a065e64b86.tar.gz | |
rendercontrol examples: Exercise key event generation as well
Task-number: QTBUG-93489
Change-Id: Ife9db7b066add1f41de964d4c41309568f954320
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
7 files changed, 62 insertions, 7 deletions
diff --git a/examples/quick/rendercontrol/rendercontrol_d3d11/demo.qml b/examples/quick/rendercontrol/rendercontrol_d3d11/demo.qml index 32e2f423d1..6717321a1a 100644 --- a/examples/quick/rendercontrol/rendercontrol_d3d11/demo.qml +++ b/examples/quick/rendercontrol/rendercontrol_d3d11/demo.qml @@ -53,9 +53,10 @@ import QtQuick.Particles 2.0 Rectangle { id: root + property bool keyDown: false gradient: Gradient { - GradientStop { position: 0; color: mouse.pressed ? "lightsteelblue" : "steelblue" } + GradientStop { position: 0; color: mouse.pressed ? "lightsteelblue" : (keyDown ? "blue" : "steelblue") } GradientStop { position: 1; color: "black" } } @@ -205,4 +206,7 @@ Rectangle { id: mouse anchors.fill: parent } + + Keys.onPressed: keyDown = true + Keys.onReleased: keyDown = false } diff --git a/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp b/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp index 478ce88344..eb3d3b4c3c 100644 --- a/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp +++ b/examples/quick/rendercontrol/rendercontrol_d3d11/window.cpp @@ -130,12 +130,12 @@ Window::Window(Engine *engine) qWarning() << error.url() << error.line() << error; } - QQuickItem *rootItem = qobject_cast<QQuickItem *>(rootObject); - rootItem->setSize(QSize(QML_WIDTH, QML_HEIGHT)); - m_quickWindow->contentItem()->setSize(rootItem->size()); - m_quickWindow->setGeometry(0, 0, rootItem->width(), rootItem->height()); + m_rootItem = qobject_cast<QQuickItem *>(rootObject); + m_rootItem->setSize(QSize(QML_WIDTH, QML_HEIGHT)); + m_quickWindow->contentItem()->setSize(m_rootItem->size()); + m_quickWindow->setGeometry(0, 0, m_rootItem->width(), m_rootItem->height()); - rootItem->setParentItem(m_quickWindow->contentItem()); + m_rootItem->setParentItem(m_quickWindow->contentItem()); } Window::~Window() @@ -185,6 +185,16 @@ void Window::mouseReleaseEvent(QMouseEvent *e) QCoreApplication::sendEvent(m_quickWindow, &mappedEvent); } +void Window::keyPressEvent(QKeyEvent *e) +{ + QCoreApplication::sendEvent(m_quickWindow, e); +} + +void Window::keyReleaseEvent(QKeyEvent *e) +{ + QCoreApplication::sendEvent(m_quickWindow, e); +} + bool Window::event(QEvent *e) { switch (e->type()) { @@ -372,6 +382,9 @@ void Window::updateQuick() QSize(QML_WIDTH, QML_HEIGHT), SAMPLE_COUNT)); + // Ensure key events are received by the root Rectangle. + m_rootItem->forceActiveFocus(); + m_quickInitialized = true; } diff --git a/examples/quick/rendercontrol/rendercontrol_d3d11/window.h b/examples/quick/rendercontrol/rendercontrol_d3d11/window.h index 4a102bd4dd..9a66898c5b 100644 --- a/examples/quick/rendercontrol/rendercontrol_d3d11/window.h +++ b/examples/quick/rendercontrol/rendercontrol_d3d11/window.h @@ -57,6 +57,7 @@ QT_BEGIN_NAMESPACE class QQuickRenderControl; class QQuickWindow; +class QQuickItem; class QQmlEngine; class QQmlComponent; QT_END_NAMESPACE @@ -71,6 +72,8 @@ protected: void exposeEvent(QExposeEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; + void keyPressEvent(QKeyEvent *e) override; + void keyReleaseEvent(QKeyEvent *e) override; bool event(QEvent *e) override; private: @@ -84,6 +87,7 @@ private: QQuickWindow *m_quickWindow; QQmlEngine *m_qmlEngine; QQmlComponent *m_qmlComponent; + QQuickItem *m_rootItem; bool m_quickInitialized = false; bool m_quickDirty = true; diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/demo.qml b/examples/quick/rendercontrol/rendercontrol_opengl/demo.qml index 0312c2ec1c..f5876feadc 100644 --- a/examples/quick/rendercontrol/rendercontrol_opengl/demo.qml +++ b/examples/quick/rendercontrol/rendercontrol_opengl/demo.qml @@ -53,9 +53,10 @@ import QtQuick.Particles 2.0 Rectangle { id: root + property bool keyDown: false gradient: Gradient { - GradientStop { position: 0; color: mouse.pressed ? "lightsteelblue" : "steelblue" } + GradientStop { position: 0; color: mouse.pressed ? "lightsteelblue" : (keyDown ? "blue" : "steelblue") } GradientStop { position: 1; color: "black" } } @@ -205,4 +206,7 @@ Rectangle { id: mouse anchors.fill: parent } + + Keys.onPressed: keyDown = true + Keys.onReleased: keyDown = false } diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/doc/src/rendercontrol_opengl.qdoc b/examples/quick/rendercontrol/rendercontrol_opengl/doc/src/rendercontrol_opengl.qdoc index a4a648e5de..ecf7ab35ee 100644 --- a/examples/quick/rendercontrol/rendercontrol_opengl/doc/src/rendercontrol_opengl.qdoc +++ b/examples/quick/rendercontrol/rendercontrol_opengl/doc/src/rendercontrol_opengl.qdoc @@ -30,4 +30,19 @@ \example rendercontrol/rendercontrol_opengl \brief Shows how to render a Qt Quick scene into a texture that is then used by a non-Quick based OpenGL renderer. \image rendercontrol-opengl-example.jpg + + The Qt Quick scene is managed by a QQuickWindow that is not visible + on-screen. Rather, rendering targets an OpenGL texture and is controlled + through QQuickRenderControl. + + The cube is rendered directly with OpenGL, using Qt Gui enablers such as + QWindow, QOpenGLContext, QOpenGLShaderProgram, and QOpenGLFunctions. The + cube is textured with the texture that the Qt Quick render pass outputs to. + + In addition, basic input event forwarding is also demonstrated. When holding + down the left mouse button, the background \l Rectangle color is altered via + QML bindings. Similarly, holding down a key on the keyboard changes the + color as well. This proves that the "fake" events sent from the application + (generated based on events from the on-screen QWindow) are forwarded and + processed within the Qt Quick scene. */ diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp b/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp index 8316772d3c..e41db09d4f 100644 --- a/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp +++ b/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.cpp @@ -253,6 +253,9 @@ void WindowSingleThreaded::run() // Update item and rendering related geometries. updateSizes(); + // Ensure key events are received by the root Rectangle. + m_rootItem->forceActiveFocus(); + // Initialize the render control and our OpenGL resources. m_context->makeCurrent(m_offscreenSurface); m_quickWindow->setGraphicsDevice(QQuickGraphicsDevice::fromOpenGLContext(m_context)); @@ -331,3 +334,13 @@ void WindowSingleThreaded::mouseReleaseEvent(QMouseEvent *e) QMouseEvent mappedEvent(e->type(), e->position(), e->globalPosition(), e->button(), e->buttons(), e->modifiers()); QCoreApplication::sendEvent(m_quickWindow, &mappedEvent); } + +void WindowSingleThreaded::keyPressEvent(QKeyEvent *e) +{ + QCoreApplication::sendEvent(m_quickWindow, e); +} + +void WindowSingleThreaded::keyReleaseEvent(QKeyEvent *e) +{ + QCoreApplication::sendEvent(m_quickWindow, e); +} diff --git a/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.h b/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.h index ad53d5c8a5..b534f7316c 100644 --- a/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.h +++ b/examples/quick/rendercontrol/rendercontrol_opengl/window_singlethreaded.h @@ -81,6 +81,8 @@ protected: void resizeEvent(QResizeEvent *e) override; void mousePressEvent(QMouseEvent *e) override; void mouseReleaseEvent(QMouseEvent *e) override; + void keyPressEvent(QKeyEvent *e) override; + void keyReleaseEvent(QKeyEvent *e) override; private slots: void run(); |
