From c54a5b83804c00474d141b485b752a7c54169ebf Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Wed, 12 Aug 2020 13:21:42 +0200 Subject: Introduce QWidget::setScreen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follows the QWindow semantics, and is a replacement for creating a QWidget with a QDesktopScreenWidget as the parent. We can now remove much of the special handling of QDesktopWidget and the Qt::Desktop window type, and get rid of QDesktopScreenWidget. Add a manual test that allows local testing. Our CI environments only have a single screen, and no multi-head display server setup which is the primary case where QWidget::setScreen is interesting. For the more common case of a virtual desktop, QWidget::setScreen has no real impact (just as QWindow::setScreen doesn't). Change-Id: Id0099e069d316741bacd8c795c396ccad37be297 Fixes: QTBUG-85483 Reviewed-by: Tor Arne Vestbø --- tests/manual/widgets/kernel/CMakeLists.txt | 1 + tests/manual/widgets/kernel/kernel.pro | 2 +- .../manual/widgets/kernel/setscreen/CMakeLists.txt | 18 +++ tests/manual/widgets/kernel/setscreen/main.cpp | 156 +++++++++++++++++++++ .../manual/widgets/kernel/setscreen/setscreen.pro | 3 + 5 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 tests/manual/widgets/kernel/setscreen/CMakeLists.txt create mode 100644 tests/manual/widgets/kernel/setscreen/main.cpp create mode 100644 tests/manual/widgets/kernel/setscreen/setscreen.pro (limited to 'tests/manual/widgets/kernel') diff --git a/tests/manual/widgets/kernel/CMakeLists.txt b/tests/manual/widgets/kernel/CMakeLists.txt index 9be003391d..b4443fa3e2 100644 --- a/tests/manual/widgets/kernel/CMakeLists.txt +++ b/tests/manual/widgets/kernel/CMakeLists.txt @@ -3,3 +3,4 @@ # add_subdirectory(qtooltip) # special case broken in dev add_subdirectory(sizeonhide) add_subdirectory(layoutreplace) +add_subdirectory(setscreen) diff --git a/tests/manual/widgets/kernel/kernel.pro b/tests/manual/widgets/kernel/kernel.pro index 5dbd25f8bd..236c9ff9d6 100644 --- a/tests/manual/widgets/kernel/kernel.pro +++ b/tests/manual/widgets/kernel/kernel.pro @@ -1,2 +1,2 @@ TEMPLATE = subdirs -SUBDIRS = qtooltip sizeonhide layoutreplace +SUBDIRS = qtooltip sizeonhide layoutreplace setscreen diff --git a/tests/manual/widgets/kernel/setscreen/CMakeLists.txt b/tests/manual/widgets/kernel/setscreen/CMakeLists.txt new file mode 100644 index 0000000000..cf31341d7c --- /dev/null +++ b/tests/manual/widgets/kernel/setscreen/CMakeLists.txt @@ -0,0 +1,18 @@ +# Generated from setscreen.pro. + +##################################################################### +## setscreen Binary: +##################################################################### + +qt_add_manual_test(setscreen + GUI + SOURCES + main.cpp + PUBLIC_LIBRARIES + Qt::CorePrivate + Qt::Gui + Qt::Widgets +) + +#### Keys ignored in scope 1:.:.:setscreen.pro:: +# TEMPLATE = "app" diff --git a/tests/manual/widgets/kernel/setscreen/main.cpp b/tests/manual/widgets/kernel/setscreen/main.cpp new file mode 100644 index 0000000000..70ec067d3d --- /dev/null +++ b/tests/manual/widgets/kernel/setscreen/main.cpp @@ -0,0 +1,156 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +class ScreenWidget : public QWidget +{ +public: + ScreenWidget(QWidget *parent) + : QWidget(parent, Qt::Window) + { + textEdit = new QTextEdit; + textEdit->setReadOnly(true); + + QHBoxLayout *layout = new QHBoxLayout; + layout->addWidget(textEdit); + setLayout(layout); + } + + void updateText() + { + QString text = ""; + text += QString("

Screen: %1\n

").arg(screen()->name()); + text += QString("

DPR: %1\n

").arg(screen()->devicePixelRatio()); + text += QString(""); + + textEdit->setText(text); + } + +private: + QTextEdit *textEdit; +}; + +class Controller : public QDialog +{ + Q_OBJECT + +public: + Controller() + { + QPushButton *screenButton = new QPushButton; + screenButton->setText("Show on Screen"); + screenButton->setEnabled(false); + connect(screenButton, &QAbstractButton::clicked, this, &Controller::setScreen); + + QPushButton *desktopButton = new QPushButton; + desktopButton->setText("Show on Desktop"); + desktopButton->setEnabled(false); + connect(desktopButton, &QAbstractButton::clicked, this, &Controller::setDesktop); + + QPushButton *exitButton = new QPushButton; + exitButton->setText("E&xit"); + connect(exitButton, &QAbstractButton::clicked, QApplication::instance(), &QCoreApplication::quit); + + QHBoxLayout *actionLayout = new QHBoxLayout; + actionLayout->addWidget(screenButton); + actionLayout->addWidget(desktopButton); + actionLayout->addWidget(exitButton); + + QGroupBox *radioGroup = new QGroupBox; + radioGroup->setTitle(QLatin1String("Select target screen")); + + QVBoxLayout *groupLayout = new QVBoxLayout; + const auto screens = QGuiApplication::screens(); + int count = 0; + for (const auto &screen : screens) { + QRadioButton *choice = new QRadioButton; + choice->setText(QString(QLatin1String("%1: %2")).arg(count).arg(screen->name())); + connect(choice, &QAbstractButton::toggled, this, [=](bool on){ + if (on) + targetScreen = count; + screenButton->setEnabled(targetScreen != -1); + desktopButton->setEnabled(targetScreen != -1); + }); + groupLayout->addWidget(choice); + ++count; + } + radioGroup->setLayout(groupLayout); + + QVBoxLayout *layout = new QVBoxLayout; + layout->addWidget(radioGroup); + layout->addLayout(actionLayout); + setLayout(layout); + } + +private slots: + void setScreen() + { + QScreen *screen = QGuiApplication::screens().at(targetScreen); + if (!widget) { + widget = new ScreenWidget(this); + widget->setAttribute(Qt::WA_DeleteOnClose); + widget->setWindowTitle("Normal Window"); + } + widget->setScreen(screen); + widget->show(); + widget->updateText(); + } + + void setDesktop() + { + QScreen *screen = QGuiApplication::screens().at(targetScreen); + QWidget *desktop = QApplication::desktop(screen); + if (!desktopChild) { + desktopChild = new ScreenWidget(desktop); + desktopChild->setAttribute(Qt::WA_DeleteOnClose); + desktopChild->setWindowTitle("Child of a Desktop"); + } else { + desktopChild->setParent(desktop); + } + desktopChild->show(); + desktopChild->updateText(); + } + +private: + QPointer widget = nullptr; + QPointer desktopChild = nullptr; + int targetScreen = -1; +}; + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + + Controller controller; + controller.show(); + + return app.exec(); +} + +#include "main.moc" diff --git a/tests/manual/widgets/kernel/setscreen/setscreen.pro b/tests/manual/widgets/kernel/setscreen/setscreen.pro new file mode 100644 index 0000000000..f06006ea3a --- /dev/null +++ b/tests/manual/widgets/kernel/setscreen/setscreen.pro @@ -0,0 +1,3 @@ +TEMPLATE = app +SOURCES = main.cpp +QT += widgets -- cgit v1.2.3