diff options
Diffstat (limited to 'tests/manual/examples/qpa')
-rw-r--r-- | tests/manual/examples/qpa/CMakeLists.txt | 8 | ||||
-rw-r--r-- | tests/manual/examples/qpa/qpa.pro | 5 | ||||
-rw-r--r-- | tests/manual/examples/qpa/qrasterwindow/CMakeLists.txt | 35 | ||||
-rw-r--r-- | tests/manual/examples/qpa/qrasterwindow/main.cpp | 91 | ||||
-rw-r--r-- | tests/manual/examples/qpa/qrasterwindow/qrasterwindow.pro | 4 | ||||
-rw-r--r-- | tests/manual/examples/qpa/windows/CMakeLists.txt | 38 | ||||
-rw-r--r-- | tests/manual/examples/qpa/windows/main.cpp | 50 | ||||
-rw-r--r-- | tests/manual/examples/qpa/windows/window.cpp | 164 | ||||
-rw-r--r-- | tests/manual/examples/qpa/windows/window.h | 41 | ||||
-rw-r--r-- | tests/manual/examples/qpa/windows/windows.pro | 9 |
10 files changed, 445 insertions, 0 deletions
diff --git a/tests/manual/examples/qpa/CMakeLists.txt b/tests/manual/examples/qpa/CMakeLists.txt new file mode 100644 index 0000000000..1cf5edd939 --- /dev/null +++ b/tests/manual/examples/qpa/CMakeLists.txt @@ -0,0 +1,8 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +if(NOT TARGET Qt6::Gui) + return() +endif() +qt_internal_add_example(windows) +qt_internal_add_example(qrasterwindow) diff --git a/tests/manual/examples/qpa/qpa.pro b/tests/manual/examples/qpa/qpa.pro new file mode 100644 index 0000000000..85b51dc5f4 --- /dev/null +++ b/tests/manual/examples/qpa/qpa.pro @@ -0,0 +1,5 @@ +requires(qtHaveModule(gui)) + +TEMPLATE = subdirs +SUBDIRS = windows \ + qrasterwindow diff --git a/tests/manual/examples/qpa/qrasterwindow/CMakeLists.txt b/tests/manual/examples/qpa/qrasterwindow/CMakeLists.txt new file mode 100644 index 0000000000..3770400268 --- /dev/null +++ b/tests/manual/examples/qpa/qrasterwindow/CMakeLists.txt @@ -0,0 +1,35 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(qrasterwindow LANGUAGES CXX) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/qpa/qrasterwindow") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui) + +qt_standard_project_setup() + +qt_add_executable(qrasterwindow + main.cpp +) + +set_target_properties(qrasterwindow PROPERTIES + WIN32_EXECUTABLE TRUE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(qrasterwindow PRIVATE + Qt6::Core + Qt6::Gui +) + +install(TARGETS qrasterwindow + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/tests/manual/examples/qpa/qrasterwindow/main.cpp b/tests/manual/examples/qpa/qrasterwindow/main.cpp new file mode 100644 index 0000000000..9c245bf8a1 --- /dev/null +++ b/tests/manual/examples/qpa/qrasterwindow/main.cpp @@ -0,0 +1,91 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include <QRasterWindow> +#include <QPainter> +#include <QPainterPath> +#include <QGuiApplication> +#include <QMatrix4x4> +#include <QTimer> + +static QPainterPath painterPathForTriangle() +{ + static const QPointF bottomLeft(-1.0, -1.0); + static const QPointF top(0.0, 1.0); + static const QPointF bottomRight(1.0, -1.0); + + QPainterPath path(bottomLeft); + path.lineTo(top); + path.lineTo(bottomRight); + path.closeSubpath(); + return path; +} + +class PaintedWindow : public QRasterWindow +{ + Q_OBJECT + +public: + PaintedWindow() + { + m_view.lookAt(QVector3D(3,1,1), + QVector3D(0,0,0), + QVector3D(0,1,0)); + m_timer.setInterval(16); + connect(&m_timer, &QTimer::timeout, this, qOverload<>(&PaintedWindow::update)); + m_timer.start(); + } + +protected: + void paintEvent(QPaintEvent *) + { + QPainter p(this); + p.fillRect(QRect(0,0,width(),height()),Qt::gray); + + p.setWorldTransform(m_window_matrix.toTransform()); + + QMatrix4x4 mvp = m_projection * m_view * m_model; + p.setTransform(mvp.toTransform(), true); + + p.fillPath(painterPathForTriangle(), m_brush); + + m_model.rotate(1, 0, 1, 0); + } + + void resizeEvent(QResizeEvent *) + { + m_window_matrix = QTransform(); + m_window_matrix.translate(width() / 2.0, height() / 2.0); + m_window_matrix.scale(width() / 2.0, -height() / 2.0); + + m_projection.setToIdentity(); + m_projection.perspective(45.f, qreal(width()) / qreal(height()), 0.1f, 100.f); + + QLinearGradient gradient(QPointF(-1,-1), QPointF(1,1)); + gradient.setColorAt(0, Qt::red); + gradient.setColorAt(1, Qt::green); + + m_brush = QBrush(gradient); + } + +private: + QMatrix4x4 m_window_matrix; + QMatrix4x4 m_projection; + QMatrix4x4 m_view; + QMatrix4x4 m_model; + QBrush m_brush; + QTimer m_timer; +}; + +int main (int argc, char **argv) +{ + QGuiApplication app(argc, argv); + + PaintedWindow window; + window.create(); + window.show(); + + return app.exec(); +} + +#include "main.moc" diff --git a/tests/manual/examples/qpa/qrasterwindow/qrasterwindow.pro b/tests/manual/examples/qpa/qrasterwindow/qrasterwindow.pro new file mode 100644 index 0000000000..e5bf34f25c --- /dev/null +++ b/tests/manual/examples/qpa/qrasterwindow/qrasterwindow.pro @@ -0,0 +1,4 @@ +SOURCES += main.cpp + +target.path = $$[QT_INSTALL_EXAMPLES]/qpa/qrasterwindow +INSTALLS += target diff --git a/tests/manual/examples/qpa/windows/CMakeLists.txt b/tests/manual/examples/qpa/windows/CMakeLists.txt new file mode 100644 index 0000000000..3ced0d4b96 --- /dev/null +++ b/tests/manual/examples/qpa/windows/CMakeLists.txt @@ -0,0 +1,38 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +cmake_minimum_required(VERSION 3.16) +project(windows LANGUAGES CXX) + +if(NOT DEFINED INSTALL_EXAMPLESDIR) + set(INSTALL_EXAMPLESDIR "examples") +endif() + +set(INSTALL_EXAMPLEDIR "${INSTALL_EXAMPLESDIR}/qpa/windows") + +find_package(Qt6 REQUIRED COMPONENTS Core Gui) + +qt_standard_project_setup() + +qt_add_executable(windows + main.cpp + window.cpp window.h +) + +set_target_properties(windows PROPERTIES + WIN32_EXECUTABLE FALSE + MACOSX_BUNDLE TRUE +) + +target_link_libraries(windows PRIVATE + Qt6::Core + Qt6::CorePrivate + Qt6::Gui + Qt6::GuiPrivate +) + +install(TARGETS windows + RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" + BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" + LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" +) diff --git a/tests/manual/examples/qpa/windows/main.cpp b/tests/manual/examples/qpa/windows/main.cpp new file mode 100644 index 0000000000..b2ce40c439 --- /dev/null +++ b/tests/manual/examples/qpa/windows/main.cpp @@ -0,0 +1,50 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include <QGuiApplication> +#include <QScreen> +#include <QRect> +#include <QSharedPointer> + +#include "window.h" + +int main(int argc, char **argv) +{ + typedef QSharedPointer<QWindow> WindowPtr; + + QGuiApplication app(argc, argv); + + Window a; + a.setFramePosition(QPoint(10, 10)); + a.setTitle(QStringLiteral("Window A")); + a.setObjectName(a.title()); + a.setVisible(true); + + Window b; + b.setFramePosition(QPoint(100, 100)); + b.setTitle(QStringLiteral("Window B")); + b.setObjectName(b.title()); + b.setVisible(true); + + Window child(&b); + child.setObjectName(QStringLiteral("ChildOfB")); + child.setVisible(true); + + // create one window on each additional screen as well + + QList<WindowPtr> windows; + const QList<QScreen *> screens = app.screens(); + for (QScreen *screen : screens) { + if (screen == app.primaryScreen()) + continue; + WindowPtr window(new Window(screen)); + QRect geometry = window->geometry(); + geometry.moveCenter(screen->availableGeometry().center()); + window->setGeometry(geometry); + window->setVisible(true); + window->setTitle(screen->name()); + window->setObjectName(window->title()); + windows.push_back(window); + } + return app.exec(); +} diff --git a/tests/manual/examples/qpa/windows/window.cpp b/tests/manual/examples/qpa/windows/window.cpp new file mode 100644 index 0000000000..e86a4f7cfd --- /dev/null +++ b/tests/manual/examples/qpa/windows/window.cpp @@ -0,0 +1,164 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#include "window.h" + +#include <private/qguiapplication_p.h> + +#include <QBackingStore> +#include <QPainter> + +static int colorIndexId = 0; + +QColor colorTable[] = +{ + QColor("#f09f8f"), + QColor("#a2bff2"), + QColor("#c0ef8f") +}; + +Window::Window(QScreen *screen) + : QWindow(screen) + , m_backgroundColorIndex(colorIndexId++) +{ + initialize(); +} + +Window::Window(QWindow *parent) + : QWindow(parent) + , m_backgroundColorIndex(colorIndexId++) +{ + initialize(); +} + +void Window::initialize() +{ + if (parent()) + setGeometry(QRect(160, 120, 320, 240)); + else { + setFlags(flags() | Qt::WindowTitleHint | Qt::WindowSystemMenuHint + | Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint); + const QSize baseSize = QSize(640, 480); + setGeometry(QRect(geometry().topLeft(), baseSize)); + + setSizeIncrement(QSize(10, 10)); + setBaseSize(baseSize); + setMinimumSize(QSize(240, 160)); + setMaximumSize(QSize(800, 600)); + } + + create(); + m_backingStore = new QBackingStore(this); + + m_image = QImage(geometry().size(), QImage::Format_RGB32); + m_image.fill(colorTable[m_backgroundColorIndex % (sizeof(colorTable) / sizeof(colorTable[0]))].rgba()); + + m_lastPos = QPoint(-1, -1); + m_renderTimer = 0; +} + +void Window::mousePressEvent(QMouseEvent *event) +{ + m_lastPos = event->position().toPoint(); +} + +void Window::mouseMoveEvent(QMouseEvent *event) +{ + if (m_lastPos != QPoint(-1, -1)) { + QPainter p(&m_image); + p.setRenderHint(QPainter::Antialiasing); + p.drawLine(m_lastPos, event->position().toPoint()); + m_lastPos = event->position().toPoint(); + + scheduleRender(); + } +} + +void Window::mouseReleaseEvent(QMouseEvent *event) +{ + if (m_lastPos != QPoint(-1, -1)) { + QPainter p(&m_image); + p.setRenderHint(QPainter::Antialiasing); + p.drawLine(m_lastPos, event->position().toPoint()); + m_lastPos = QPoint(-1, -1); + + scheduleRender(); + } +} + +void Window::exposeEvent(QExposeEvent *) +{ + scheduleRender(); +} + +void Window::resizeEvent(QResizeEvent *) +{ + QImage old = m_image; + + int width = qMax(geometry().width(), old.width()); + int height = qMax(geometry().height(), old.height()); + + if (width > old.width() || height > old.height()) { + m_image = QImage(width, height, QImage::Format_RGB32); + m_image.fill(colorTable[(m_backgroundColorIndex) % (sizeof(colorTable) / sizeof(colorTable[0]))].rgba()); + + QPainter p(&m_image); + p.drawImage(0, 0, old); + } + scheduleRender(); +} + +void Window::keyPressEvent(QKeyEvent *event) +{ + switch (event->key()) { + case Qt::Key_Backspace: + m_text.chop(1); + break; + case Qt::Key_Enter: + case Qt::Key_Return: + m_text.append('\n'); + break; + default: + m_text.append(event->text()); + break; + } + scheduleRender(); +} + +void Window::scheduleRender() +{ + if (!m_renderTimer) + m_renderTimer = startTimer(1); +} + +void Window::timerEvent(QTimerEvent *) +{ + if (isExposed()) + render(); + killTimer(m_renderTimer); + m_renderTimer = 0; +} + +void Window::render() +{ + QRect rect(QPoint(), geometry().size()); + m_backingStore->resize(rect.size()); + + m_backingStore->beginPaint(rect); + + QPaintDevice *device = m_backingStore->paintDevice(); + + QPainter p(device); + p.drawImage(0, 0, m_image); + + QFont font; + font.setPixelSize(32); + + p.setFont(font); + p.drawText(rect, 0, m_text); + + m_backingStore->endPaint(); + m_backingStore->flush(rect); +} + + diff --git a/tests/manual/examples/qpa/windows/window.h b/tests/manual/examples/qpa/windows/window.h new file mode 100644 index 0000000000..c7eae4028a --- /dev/null +++ b/tests/manual/examples/qpa/windows/window.h @@ -0,0 +1,41 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause + +#ifndef WINDOW_H +#define WINDOW_H + +#include <QWindow> +#include <QImage> + +class Window : public QWindow +{ +public: + Window(QWindow *parent = nullptr); + Window(QScreen *screen); + +protected: + void mousePressEvent(QMouseEvent *) override; + void mouseMoveEvent(QMouseEvent *) override; + void mouseReleaseEvent(QMouseEvent *) override; + + void keyPressEvent(QKeyEvent *) override; + + void exposeEvent(QExposeEvent *) override; + void resizeEvent(QResizeEvent *) override; + + void timerEvent(QTimerEvent *) override; + +private: + void render(); + void scheduleRender(); + void initialize(); + + QString m_text; + QImage m_image; + QPoint m_lastPos; + int m_backgroundColorIndex; + QBackingStore *m_backingStore; + int m_renderTimer; +}; + +#endif // WINDOW_H diff --git a/tests/manual/examples/qpa/windows/windows.pro b/tests/manual/examples/qpa/windows/windows.pro new file mode 100644 index 0000000000..cf2b7ab200 --- /dev/null +++ b/tests/manual/examples/qpa/windows/windows.pro @@ -0,0 +1,9 @@ +CONFIG += console +QT += gui-private core-private + +HEADERS += window.h +SOURCES += window.cpp main.cpp + +# install +target.path = $$[QT_INSTALL_EXAMPLES]/qpa/windows +INSTALLS += target |