diff options
Diffstat (limited to 'tests/manual/windowmask')
-rw-r--r-- | tests/manual/windowmask/CMakeLists.txt | 14 | ||||
-rw-r--r-- | tests/manual/windowmask/main.cpp | 124 |
2 files changed, 138 insertions, 0 deletions
diff --git a/tests/manual/windowmask/CMakeLists.txt b/tests/manual/windowmask/CMakeLists.txt new file mode 100644 index 0000000000..e1417bedbe --- /dev/null +++ b/tests/manual/windowmask/CMakeLists.txt @@ -0,0 +1,14 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +##################################################################### +## windowmask Binary: +##################################################################### + +qt_internal_add_manual_test(windowmask + SOURCES + main.cpp + LIBRARIES + Qt::Gui + Qt::Widgets +) diff --git a/tests/manual/windowmask/main.cpp b/tests/manual/windowmask/main.cpp new file mode 100644 index 0000000000..3055e18a42 --- /dev/null +++ b/tests/manual/windowmask/main.cpp @@ -0,0 +1,124 @@ +// Copyright (C) 2023 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only + +#include <QtWidgets> + +template<typename Paintable> +class Circle : public Paintable +{ +public: + using Paintable::setMinimumSize; + using Paintable::setMaximumSize; + using Paintable::width; + using Paintable::height; + using Paintable::screen; + using Paintable::devicePixelRatio; + using Paintable::metaObject; + using Paintable::setMask; + using Paintable::frameGeometry; + using Paintable::setPosition; + using Paintable::startSystemMove; + using Paintable::setFlags; + using Paintable::requestUpdate; + + Circle() + { + setMinimumSize({200, 200}); + setMaximumSize({200, 200}); + setFlags(Qt::Window | Qt::FramelessWindowHint); + } + +protected: + void paintEvent(QPaintEvent *) override + { + qWarning() << "Painting into a" << this << "with DPR" << devicePixelRatio() + << "on a screen with DPR" << screen()->devicePixelRatio(); + QPainter painter(static_cast<Paintable *>(this)); + painter.fillRect(0, 0, width(), height(), devicePixelRatio() == 1 ? Qt::red : Qt::green); + painter.setPen(QPen(Qt::black, 5)); + painter.drawRect(10, 10, width() - 20, height() - 20); + painter.drawText(0, 0, width(), height(), Qt::AlignHCenter | Qt::AlignVCenter, metaObject()->className()); + } + void mousePressEvent(QMouseEvent *event) override + { + if (event->button() == Qt::LeftButton) { + if (event->modifiers() & Qt::ControlModifier) + requestUpdate(); + else if (event->modifiers() & Qt::AltModifier) + updateMask(); + else if (event->modifiers() & Qt::ShiftModifier && startSystemMove()) + dragPosition = {}; + else + dragPosition = event->globalPosition() - frameGeometry().topLeft(); + } + } + void mouseMoveEvent(QMouseEvent *event) override + { + if (event->buttons() & Qt::LeftButton && !dragPosition.isNull()) + setPosition((event->globalPosition() - dragPosition).toPoint()); + } + void resizeEvent(QResizeEvent *) override + { + updateMask(); + } + + void updateMask() + { + int side = qMin(width(), height()); + QRegion maskedRegion(width() / 2 - side / 2, height() / 2 - side / 2, side, + side, QRegion::Ellipse); + qDebug() << "Updating mask for" << this << "to" << maskedRegion.boundingRect(); + setMask(maskedRegion); + } + + QPointF dragPosition; +}; + +class WindowLikeWidget : public QWidget +{ +public: + void setPosition(const QPoint &point) { QWidget::move(point); } + bool startSystemMove() { return windowHandle()->startSystemMove(); } + void setFlags(Qt::WindowFlags flags) { setWindowFlags(flags); } + void requestUpdate() { update(); } +}; + +class Widget : public Circle<WindowLikeWidget> +{ +public: + Widget() + { + setAttribute(Qt::WA_TranslucentBackground); + } +}; + +class Window : public Circle<QRasterWindow> +{ +}; + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + Widget widget; + widget.show(); + + Window window; + window.show(); + + auto dumpScreenData = [](QScreen *screen){ + qDebug() << "- name:" << screen->name(); + qDebug() << "- dpr :" << screen->devicePixelRatio(); + }; + + QObject::connect(widget.windowHandle(), &QWindow::screenChanged, &widget, [&]{ + qDebug() << "Screen changed for" << &widget; + dumpScreenData(widget.screen()); + }); + QObject::connect(&window, &QWindow::screenChanged, &window, [&]{ + qDebug() << "Screen changed for" << &window; + dumpScreenData(window.screen()); + }); + + return app.exec(); +} |