| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 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 <QGraphicsView> |
| #include <QGraphicsRectItem> |
| #include <QDesktopWidget> |
| #include <QApplication> |
| #include <QDebug> |
| |
| class DesktopView : public QGraphicsView |
| { |
| #if QT_DEPRECATED_SINCE(5, 11) |
| Q_OBJECT |
| public: |
| DesktopView() |
| : that(0) |
| { |
| scene = new QGraphicsScene; |
| setScene(scene); |
| |
| QDesktopWidget *desktop = QApplication::desktop(); |
| connect(desktop, SIGNAL(resized(int)), this, SLOT(updateScene())); |
| connect(desktop, SIGNAL(resized(int)), this, SLOT(desktopResized(int))); |
| connect(desktop, SIGNAL(workAreaResized(int)), this, SLOT(updateScene())); |
| connect(desktop, SIGNAL(workAreaResized(int)), this, SLOT(desktopWorkAreaResized(int))); |
| connect(desktop, SIGNAL(screenCountChanged(int)), this, SLOT(updateScene())); |
| connect(desktop, SIGNAL(screenCountChanged(int)), this, SLOT(desktopScreenCountChanged(int))); |
| |
| updateScene(); |
| |
| QTransform transform; |
| transform.scale(0.25, 0.25); |
| setTransform(transform); |
| |
| setBackgroundBrush(Qt::darkGray); |
| desktopScreenCountChanged(-1); |
| } |
| |
| protected: |
| void moveEvent(QMoveEvent *e) |
| { |
| if (that) { |
| that->setRect(appRect()); |
| scene->update(); |
| } |
| QGraphicsView::moveEvent(e); |
| } |
| void resizeEvent(QResizeEvent *e) |
| { |
| if (that) { |
| that->setRect(appRect()); |
| } |
| QGraphicsView::resizeEvent(e); |
| } |
| |
| private slots: |
| void updateScene() |
| { |
| scene->clear(); |
| |
| const QDesktopWidget *desktop = QApplication::desktop(); |
| const bool isVirtualDesktop = desktop->isVirtualDesktop(); |
| const int homeScreen = desktop->screenNumber(this); |
| |
| QRect sceneRect; |
| int screenCount = desktop->screenCount(); |
| for (int s = 0; s < screenCount; ++s) { |
| const bool isPrimary = desktop->primaryScreen() == s; |
| const QRect screenRect = desktop->screenGeometry(s); |
| const QRect workRect = desktop->availableGeometry(s); |
| const QBrush fillBrush = palette().brush(isPrimary ? QPalette::Active : QPalette::Inactive, QPalette::Highlight); |
| QGraphicsRectItem *screen = new QGraphicsRectItem(0, 0, screenRect.width(), screenRect.height()); |
| |
| if (isVirtualDesktop) { |
| thatRoot = QPoint(); |
| screen->setPos(screenRect.x(), screenRect.y()); |
| } else { |
| // for non-virtual desktops we assume that screens are |
| // simply next to each other |
| if (s) |
| screen->setPos(sceneRect.right(), 0); |
| if (s == homeScreen) |
| thatRoot = screen->pos().toPoint(); |
| } |
| |
| screen->setBrush(fillBrush); |
| scene->addItem(screen); |
| sceneRect.setLeft(qMin(sceneRect.left(), screenRect.left())); |
| sceneRect.setRight(qMax(sceneRect.right(), screenRect.right())); |
| sceneRect.setTop(qMin(sceneRect.top(), screenRect.top())); |
| sceneRect.setBottom(qMax(sceneRect.bottom(), screenRect.bottom())); |
| |
| QGraphicsRectItem *workArea = new QGraphicsRectItem(screen); |
| workArea->setRect(0, 0, workRect.width(), workRect.height()); |
| workArea->setPos(workRect.x() - screenRect.x(), workRect.y() - screenRect.y()); |
| workArea->setBrush(Qt::white); |
| |
| QGraphicsSimpleTextItem *screenNumber = new QGraphicsSimpleTextItem(workArea); |
| screenNumber->setText(QString::number(s)); |
| screenNumber->setPen(QPen(Qt::black, 1)); |
| screenNumber->setBrush(fillBrush); |
| screenNumber->setFont(QFont("Arial Black", 18)); |
| screenNumber->setTransform(QTransform().scale(10, 10)); |
| screenNumber->setTransformOriginPoint(screenNumber->boundingRect().center()); |
| QSizeF center = (workRect.size() - screenNumber->boundingRect().size()) / 2; |
| screenNumber->setPos(center.width(), center.height()); |
| |
| screen->show(); |
| screen->setZValue(1); |
| } |
| |
| if (isVirtualDesktop) { |
| QGraphicsRectItem *virtualDesktop = new QGraphicsRectItem; |
| virtualDesktop->setRect(sceneRect); |
| virtualDesktop->setPen(QPen(Qt::black)); |
| virtualDesktop->setBrush(Qt::DiagCrossPattern); |
| scene->addItem(virtualDesktop); |
| virtualDesktop->setZValue(-1); |
| virtualDesktop->show(); |
| } |
| |
| that = new QGraphicsRectItem; |
| that->setBrush(Qt::red); |
| that->setOpacity(0.5); |
| that->setZValue(2); |
| that->setRect(appRect()); |
| that->show(); |
| scene->addItem(that); |
| |
| scene->setSceneRect(sceneRect); |
| scene->update(); |
| } |
| |
| QRect appRect() const |
| { |
| QRect rect = frameGeometry(); |
| if (!QApplication::desktop()->isVirtualDesktop()) { |
| rect.translate(thatRoot); |
| } |
| return rect; |
| } |
| |
| void desktopResized(int screen) |
| { |
| qDebug() << "Screen was resized: " << screen |
| << ", new size =" << QApplication::desktop()->screenGeometry(screen); |
| } |
| void desktopWorkAreaResized(int screen) |
| { |
| qDebug() << "Screen workarea was resized: " << screen |
| << ", new size =" << QApplication::desktop()->availableGeometry(screen); |
| } |
| void desktopScreenCountChanged(int screenCount) |
| { |
| QDesktopWidget *desktop = QApplication::desktop(); |
| qDebug() << ""; |
| if (screenCount != -1) { |
| qDebug() << "Screen count was changed to " << screenCount; |
| } else { |
| screenCount = desktop->screenCount(); |
| qDebug() << "Screen count: " << screenCount; |
| } |
| for (int i = 0; i < screenCount; ++i) { |
| qDebug() << " #" << i << ": geometry =" << desktop->screenGeometry(i) |
| << "; available geometry =" << desktop->availableGeometry(i); |
| } |
| qDebug() << ""; |
| } |
| |
| private: |
| QGraphicsScene *scene; |
| QGraphicsRectItem *that; |
| QPoint thatRoot; |
| #endif |
| }; |
| |
| #include "main.moc" |
| |
| int main(int argc, char **argv) |
| { |
| QApplication app(argc, argv); |
| |
| DesktopView view; |
| view.show(); |
| |
| return app.exec(); |
| } |