【超便利】Qt GUIで仮想デスクトップをマルチタスクに活用:QScreen::virtualSizeの応用例


QScreen::virtualSizeは、Qt GUIライブラリにおいて、仮想デスクトップのサイズを取得するためのプロパティです。仮想デスクトップとは、複数の物理スクリーンを1つの大きな仮想デスクトップとして扱う機能のことです。この機能は、マルチモニター環境において、アプリケーションウィンドウを複数のスクリーンにまたがって表示したり、デスクトップ全体をシームレスにスクロールしたりするのに役立ちます。

QScreen::virtualSizeの役割

QScreen::virtualSizeプロパティは、仮想デスクトップの幅と高さをピクセル単位で返す値です。この値は、個々の物理スクリーンのサイズではなく、仮想デスクトップ全体として使用可能な領域のサイズを表します。

QScreen::virtualSizeの使用方法

QScreen::virtualSizeプロパティを使用するには、まずQScreenオブジェクトを取得する必要があります。QScreenオブジェクトは、QGuiApplication::primaryScreen()関数を使用して取得できます。

QScreen *screen = QGuiApplication::primaryScreen();

次に、取得したQScreenオブジェクトに対してvirtualSizeプロパティを呼び出すことで、仮想デスクトップのサイズを取得できます。

QSize virtualSize = screen->virtualSize();

QScreen::virtualSizeの例

以下のコード例は、仮想デスクトップの幅と高さを取得し、コンソールに出力するものです。

#include <QApplication>
#include <QScreen>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QScreen *screen = QGuiApplication::primaryScreen();
  QSize virtualSize = screen->virtualSize();

  qDebug() << "Virtual desktop width:" << virtualSize.width();
  qDebug() << "Virtual desktop height:" << virtualSize.height();

  return app.exec();
}
  • 仮想デスクトップのサイズは、オペレーティングシステムの設定によって変更される場合があります。
  • 仮想デスクトップは、すべてのプラットフォームでサポートされているわけではありません。サポートされていないプラットフォームでは、QScreen::virtualSizeプロパティは空の値を返す可能性があります。


仮想デスクトップの幅と高さを取得し、コンソールに出力するコード

#include <QApplication>
#include <QScreen>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QScreen *screen = QGuiApplication::primaryScreen();
  QSize virtualSize = screen->virtualSize();

  qDebug() << "Virtual desktop width:" << virtualSize.width();
  qDebug() << "Virtual desktop height:" << virtualSize.height();

  return app.exec();
}

仮想デスクトップ全体をシームレスにスクロールするコード

#include <QApplication>
#include <QScreen>
#include <QWidget>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QWidget widget;
  widget.resize(500, 300);
  widget.show();

  QScreen *screen = QGuiApplication::primaryScreen();
  QSize virtualSize = screen->virtualSize();

  // 仮想デスクトップ全体をスクロールする
  widget.move(0, 0);
  QTimer::singleShot(1000, &widget, [virtualSize]() {
    widget.move(virtualSize.width() - widget.width(), 0);
  });

  QTimer::singleShot(2000, &widget, [virtualSize]() {
    widget.move(virtualSize.width() - widget.width(), virtualSize.height() - widget.height());
  });

  QTimer::singleShot(3000, &widget, [virtualSize]() {
    widget.move(0, virtualSize.height() - widget.height());
  });

  return app.exec();
}

このコードは、QScreen::virtualSizeプロパティを使用して仮想デスクトップのサイズを取得し、そのサイズに合わせてウィジェットを移動することで、仮想デスクトップ全体をシームレスにスクロールするものです。

マルチモニター環境において、アプリケーションウィンドウを複数のスクリーンにまたがって表示するコード

#include <QApplication>
#include <QScreen>
#include <QWidget>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  // すべてのスクリーンを取得する
  QList<QScreen *> screens = QGuiApplication::screens();

  // 各スクリーンにウィジェットを表示する
  for (QScreen *screen : screens) {
    QSize virtualSize = screen->virtualSize();
    QWidget widget(screen);
    widget.resize(virtualSize.width() / 2, virtualSize.height() / 2);
    widget.show();
  }

  return app.exec();
}

このコードは、QGuiApplication::screens()関数を使用してすべてのスクリーンを取得し、各スクリーンにウィジェットを表示することで、マルチモニター環境において、アプリケーションウィンドウを複数のスクリーンにまたがって表示するものです。

仮想デスクトップのサイズが変更されたときにイベントを発生させるコード

#include <QApplication>
#include <QScreen>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QScreen *screen = QGuiApplication::primaryScreen();
  connect(screen, &QScreen::resized, []() {
    QSize virtualSize = screen->virtualSize();
    qDebug() << "Virtual desktop size changed to:" << virtualSize;
  });

  return app.exec();
}

このコードは、QScreen::resizedシグナルに接続することで、仮想デスクトップのサイズが変更されたときにイベントを発生させ、そのサイズをコンソールに出力するものです。

#include <QApplication>
#include <QScreen>

int main(int argc, char *argv[]) {
  QApplication app(argc, argv);

  QScreen *screen = QGuiApplication::primaryScreen();
  QSize currentSize = screen->size();
  QSize newSize(currentSize.width() * 2, currentSize.height() * 2);

  // 仮想デスクトップの解像度を変更する
  screen->setVirtualSize(newSize);

  return app.exec();
}


QScreen::virtualSizeプロパティは、仮想デスクトップのサイズを取得するための便利な機能ですが、いくつかの代替方法もあります。これらの代替方法は、状況によってはより適切な場合があります。

代替方法

  • QDesktopWidget::size()

QDesktopWidgetクラスは、デスクトップウィジェットのサイズを取得するためのプロパティを提供します。デスクトップウィジェットは、通常、仮想デスクトップと同じサイズになります。

QDesktopWidget *desktopWidget = QApplication::desktop();
QSize virtualSize = desktopWidget->size();
  • QGuiApplication::primaryScreen()->geometry().size()

QGuiApplicationクラスは、プライマリスクリーンの情報を取得するためのメソッドを提供します。プライマリスクリーンは、通常、仮想デスクトップと同じ領域を表します。

QSize virtualSize = QGuiApplication::primaryScreen()->geometry().size();
  • QProcessEnvironment::systemEnvironment().value("QT_SCREEN_SIZE")

QProcessEnvironmentクラスは、システム環境変数の情報を取得するためのメソッドを提供します。QT_SCREEN_SIZE環境変数は、仮想デスクトップのサイズを指定するために使用できます。

QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
QSize virtualSize = env.value("QT_SCREEN_SIZE").split('x').toSize();

それぞれの代替方法の比較

方法説明長所短所
QDesktopWidget::size()デスクトップウィジェットのサイズを取得するシンプルでわかりやすいデスクトップウィジェットが仮想デスクトップと同じサイズでない場合、誤った値を取得する可能性がある
QGuiApplication::primaryScreen()->geometry().size()プライマリスクリーンのジオメトリ情報からサイズを取得するQDesktopWidget::size()よりも正確複雑でわかりにくい
QProcessEnvironment::systemEnvironment().value("QT_SCREEN_SIZE")システム環境変数からサイズを取得する移植性が高いQT_SCREEN_SIZE環境変数が設定されていない場合、誤った値を取得する可能性がある

QScreen::virtualSizeプロパティは、仮想デスクトップのサイズを取得するための最も一般的な方法ですが、状況によっては上記のような代替方法の方が適切な場合があります。それぞれの代替方法の長所と短所を理解した上で、最適な方法を選択してください。

  • 仮想デスクトップのサイズは、オペレーティングシステムの設定によって変更される場合があります。
  • 仮想デスクトップは、すべてのプラットフォームでサポートされているわけではありません。サポートされていないプラットフォームでは、これらの代替方法も使用できない可能性があります。