diff options
Diffstat (limited to 'tests/manual/embeddedwindows')
-rw-r--r-- | tests/manual/embeddedwindows/CMakeLists.txt | 19 | ||||
-rw-r--r-- | tests/manual/embeddedwindows/main.cpp | 110 |
2 files changed, 129 insertions, 0 deletions
diff --git a/tests/manual/embeddedwindows/CMakeLists.txt b/tests/manual/embeddedwindows/CMakeLists.txt new file mode 100644 index 0000000000..814398631e --- /dev/null +++ b/tests/manual/embeddedwindows/CMakeLists.txt @@ -0,0 +1,19 @@ +# Copyright (C) 2023 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +qt_internal_add_manual_test(embeddedwindows + SOURCES + main.cpp + LIBRARIES + Qt::Gui +) + +if(QT_FEATURE_xcb) + target_link_libraries(embeddedwindows PRIVATE XCB::XCB) +endif() + +if(APPLE) + enable_language(OBJCXX) + set_source_files_properties(main.cpp PROPERTIES LANGUAGE OBJCXX) + set_property(TARGET embeddedwindows PROPERTY PROPERTY MACOSX_BUNDLE TRUE) +endif() diff --git a/tests/manual/embeddedwindows/main.cpp b/tests/manual/embeddedwindows/main.cpp new file mode 100644 index 0000000000..e34c7206ea --- /dev/null +++ b/tests/manual/embeddedwindows/main.cpp @@ -0,0 +1,110 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QtGui> + +#if QT_CONFIG(metal) || defined(Q_OS_WIN) || QT_CONFIG(xcb) || defined(ANDROID) +#include "../../shared/nativewindow.h" +#define HAVE_NATIVE_WINDOW +#endif + +#include <QDebug> + +class TestWindow : public QRasterWindow +{ +public: + using QRasterWindow::QRasterWindow; + TestWindow(const QBrush &brush) : m_brush(brush) {} + +protected: + void mousePressEvent(QMouseEvent *) override + { + m_pressed = true; + update(); + } + + void mouseReleaseEvent(QMouseEvent *) override + { + m_pressed = false; + update(); + } + + void paintEvent(QPaintEvent *) override + { + QPainter painter(this); + painter.setCompositionMode(QPainter::CompositionMode_Source); + if (!mask().isNull()) + painter.setClipRegion(mask()); + painter.fillRect(QRect(0, 0, width(), height()), + m_pressed ? QGradient(QGradient::JuicyPeach) : m_brush); + } + +private: + QBrush m_brush = QGradient(QGradient::DustyGrass); + bool m_pressed = false; +}; + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + TestWindow window{QGradient(QGradient::WinterNeva)}; + window.resize(500, 500); + + TestWindow *opaqueChildWindow = new TestWindow; + opaqueChildWindow->setParent(&window); + opaqueChildWindow->setGeometry(50, 50, 100, 100); + opaqueChildWindow->showNormal(); + + TestWindow *maskedChildWindow = new TestWindow; + maskedChildWindow->setParent(&window); + maskedChildWindow->setGeometry(200, 50, 100, 100); + maskedChildWindow->setMask(QRegion(0, 0, 100, 100, QRegion::Ellipse)); + maskedChildWindow->showNormal(); + + static const QColor transparentGreen = QColor(0, 255, 0, 20); + TestWindow *transparentChildWindow = new TestWindow(transparentGreen); + // The default surface format of a platform may not include + // an alpha, so set it explicitly. + QSurfaceFormat format = transparentChildWindow->format(); + format.setAlphaBufferSize(8); + transparentChildWindow->setFormat(format); + // FIXME: Windows requires this, even for child windows + transparentChildWindow->setFlag(Qt::FramelessWindowHint); + transparentChildWindow->setParent(&window); + transparentChildWindow->setGeometry(350, 50, 100, 100); + transparentChildWindow->showNormal(); + +#if defined(HAVE_NATIVE_WINDOW) + NativeWindow nativeWindow; + if (QWindow *foreignWindow = QWindow::fromWinId(nativeWindow)) { + foreignWindow->setParent(&window); + foreignWindow->setGeometry(50, 200, 100, 100); + foreignWindow->showNormal(); + } + + NativeWindow maskedNativeWindow; + if (QWindow *foreignWindow = QWindow::fromWinId(maskedNativeWindow)) { + foreignWindow->setParent(&window); + foreignWindow->setGeometry(200, 200, 100, 100); + foreignWindow->setMask(QRegion(0, 0, 100, 100, QRegion::Ellipse)); + foreignWindow->showNormal(); + } + + NativeWindow nativeParentWindow; + if (QWindow *foreignWindow = QWindow::fromWinId(nativeParentWindow)) { + foreignWindow->setParent(&window); + foreignWindow->setGeometry(50, 350, 100, 100); + foreignWindow->showNormal(); + + TestWindow *maskedChildWindowOfNativeWindow = new TestWindow; + maskedChildWindowOfNativeWindow->setParent(foreignWindow); + maskedChildWindowOfNativeWindow->setGeometry(25, 25, 50, 50); + maskedChildWindowOfNativeWindow->showNormal(); + } +#endif + + window.show(); + + return app.exec(); +} |