マルチモニター環境でQt GUIアプリケーションを開発:QInputDevice::availableVirtualGeometry()でタッチスクリーンを自在に操る


QInputDevice::availableVirtualGeometry()は、Qt GUIにおける入力デバイスの仮想デスクトップ上の利用可能領域を取得するための関数です。これは、タッチスクリーンやペンタブレットなどの入力デバイスが実際に操作できる領域を判断するために使用されます。

戻り値

この関数は、入力デバイスが利用できる仮想デスクトップ領域を表すQRectオブジェクトを返します。領域が空の場合、デバイスは仮想デスクトップ全体にアクセスできます。

使用例

以下の例は、タッチスクリーンデバイスの利用可能領域を取得し、その情報をログに出力する方法を示しています。

QInputDevice* device = QInputDevice::inputDevices(QInputDevice::DeviceType::TouchScreen).first();
if (device) {
    QRect geometry = device->availableVirtualGeometry();
    qDebug() << "Available virtual geometry for touch screen device:" << geometry;
}
  • 仮想デスクトップのサイズは、オペレーティングシステムによって異なる場合があります。
  • 入力デバイスによっては、仮想デスクトップ全体にアクセスできるものもあります。
  • この関数は、プラットフォームによって異なる動作をする場合があります。


#include <QApplication>
#include <QInputDevice>

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

    // タッチスクリーンデバイスを取得
    QInputDevice* device = QInputDevice::inputDevices(QInputDevice::DeviceType::TouchScreen).first();

    // 利用可能領域を取得
    if (device) {
        QRect geometry = device->availableVirtualGeometry();
        qDebug() << "Available virtual geometry for touch screen device:" << geometry;
    } else {
        qDebug() << "No touch screen devices found";
    }

    return app.exec();
}

例2:マルチモニター環境でタッチスクリーンデバイスを使用するアプリケーション

#include <QApplication>
#include <QInputDevice>
#include <QWidget>

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

    // タッチスクリーンデバイスを取得
    QInputDevice* device = QInputDevice::inputDevices(QInputDevice::DeviceType::TouchScreen).first();

    // 利用可能領域を取得
    if (device) {
        QRect geometry = device->availableVirtualGeometry();

        // 利用可能領域に基づいてウィジェットの位置を調整する
        QWidget widget;
        widget.setGeometry(geometry);
        widget.show();
    } else {
        qDebug() << "No touch screen devices found";
    }

    return app.exec();
}

例3:ペンタブレットデバイスの利用可能領域を取得し、その情報をログに出力する

#include <QApplication>
#include <QInputDevice>

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

    // ペンタブレットデバイスを取得
    QInputDevice* device = QInputDevice::inputDevices(QInputDevice::DeviceType::Tablet).first();

    // 利用可能領域を取得
    if (device) {
        QRect geometry = device->availableVirtualGeometry();
        qDebug() << "Available virtual geometry for tablet device:" << geometry;
    } else {
        qDebug() << "No tablet devices found";
    }

    return app.exec();
}

これらの例は、QInputDevice::availableVirtualGeometry()関数の基本的な使用方法を示しています。実際の使い方については、具体的なアプリケーションの要件に合わせて調整する必要があります。

  • ペンタブレットデバイスは、タッチスクリーンデバイスとは異なる動作をする場合があります。
  • マルチモニター環境で複数のタッチスクリーンデバイスを使用する場合は、各デバイスの利用可能領域を個別に取得する必要があります。
  • 上記の例では、エラー処理は省略されています。


代替方法の例

QScreen::availableGeometry()を使用する

QScreen::availableGeometry()関数は、画面全体の利用可能領域を取得します。これは、タッチスクリーンやペンタブレットデバイスだけでなく、マウスやキーボードなどの他の入力デバイスの利用可能領域を取得する場合にも役立ちます。

QScreen* screen = QGuiApplication::primaryScreen();
QRect geometry = screen->availableGeometry();

QWindow::screenGeometry()を使用する

QWindow::screenGeometry()関数は、ウィンドウが表示されている画面の利用可能領域を取得します。これは、アプリケーションウィンドウのサイズを画面の利用可能領域に合わせて調整したい場合に役立ちます。

QWidget* widget = new QWidget;
QRect geometry = widget->window()->screenGeometry();
widget->setGeometry(geometry);

プラットフォーム固有のAPIを使用する

一部のプラットフォームでは、QInputDevice::availableVirtualGeometry()よりも詳細な情報やより多くの機能を提供するプラットフォーム固有のAPIが用意されている場合があります。

例:macOS

macOSでは、CGDisplayAvailableGeometry()関数を使用して、画面全体の利用可能領域を取得できます。

#include <CoreFoundation/CoreFoundation.h>

CGRect geometry = CGDisplayAvailableGeometry(CGMainDisplayID());

例:Windows

Windowsでは、GetDeviceCaps()関数を使用して、画面全体の利用可能領域を取得できます。

#include <windows.h>

HDC hdc = GetDC(NULL);
RECT geometry;
GetWindowRect(hdc, &geometry);
ReleaseDC(NULL, hdc);
  • プラットフォーム固有のAPIを使用する場合は、そのAPIのドキュメントを参照してください。
  • 上記の代替方法は、プラットフォームによって異なる動作をする場合があります。