Qt GUIプログラミング:QEventPoint::globalPositionでイベントポイントのグローバル座標を簡単操作


QEventPoint::globalPositionは、Qt GUIにおけるイベントポイントのグローバル座標を取得するためのプロパティです。この座標は、スクリーン全体を基準としたものであり、複数のモニターを使用している場合でも、すべてのモニターを横断した位置を表します。

用途

QEventPoint::globalPositionは、さまざまな用途で利用できます。主な用途は以下の通りです。

  • スクリーン座標をウィジェット座標に変換する
  • 複数のウィジェット間の距離を測定する
  • ウィジェットをドラッグした際の移動距離を計算する
  • マウスカーソルやタッチスクリーンの現在位置を把握する

使用方法

QEventPoint::globalPositionを使用するには、以下の手順が必要です。

  1. QEventPointオブジェクトを取得します。これは、イベントハンドラ内でQEvent::point()メソッドを使用して取得できます。
  2. QEventPoint::globalPosition()プロパティを呼び出して、グローバル座標を取得します。
  3. 取得した座標は、QPointF型で表現されます。この型には、x()y()メソッドがあり、それぞれX軸方向とY軸方向の座標値を取得できます。

以下のコードは、マウスカーソルがウィジェット上で移動した際に、そのグローバル座標をログに出力する例です。

void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
    QEventPoint point = event->point();
    QPointF globalPosition = point.globalPosition();

    qDebug() << "Global position: " << globalPosition;
}
  • マルチモニター環境では、複数のモニターを横断した位置を返すことに注意する必要があります。必要に応じて、どのモニターに属する座標なのかを判別する処理が必要となります。
  • QEventPoint::globalPositionは、イベント発生時の座標を取得します。イベントハンドラが処理されるまでに座標が変化する可能性があることに注意する必要があります。


#include <QApplication>
#include <QWidget>
#include <QMouseEvent>

class MyWidget : public QWidget
{
public:
    MyWidget(QWidget *parent = nullptr);

protected:
    void mouseMoveEvent(QMouseEvent *event) override;
};

MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
}

void MyWidget::mouseMoveEvent(QMouseEvent *event)
{
    QEventPoint point = event->point();
    QPointF globalPosition = point.globalPosition();

    qDebug() << "Global position: " << globalPosition;
}

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

    MyWidget widget;
    widget.show();

    return app.exec();
}
  1. MyWidgetクラスを定義します。このクラスは、QWidgetを継承したカスタムウィジェットです。
  2. MyWidgetクラスのコンストラクタを定義します。このコンストラクタは、ウィジェットを作成し、表示します。
  3. mouseMoveEvent()メソッドをオーバーライドします。このメソッドは、マウスカーソルがウィジェット上で移動した際に呼び出されます。
  4. mouseMoveEvent()メソッド内で、イベントポイントを取得します。
  5. イベントポイントからグローバル座標を取得します。
  6. 取得したグローバル座標をログに出力します。
  7. main()関数で、QApplicationオブジェクトを作成し、MyWidgetウィジェットを作成して表示します。
  8. アプリケーションを実行します。
  • マルチモニター環境で動作させる場合は、取得したグローバル座標がどのモニターに属するのかを判別する処理が必要となる場合があります。


代替方法

  • QDesktopWidget::screenGeometry():現在のデスクトップのジオメトリを取得します。この情報を使用して、イベントポイントをグローバル座標に変換することができます。
  • QWidget::mapToGlobal():ウィジェット座標をグローバル座標に変換します。イベントポイントではなく、ウィジェット自体の座標を対象としています。
  • QCursor::pos():マウスカーソルの現在位置をグローバル座標で取得します。ただし、タッチスクリーンイベントには対応していません。

各方法の詳細

QCursor::pos()

  • デメリット:タッチスクリーンイベントには対応していない
  • メリット:シンプルで使いやすい

QWidget::mapToGlobal()`

  • デメリット:イベントポイントではなく、ウィジェット自体の座標を対象としている
  • メリット:ウィジェット座標をグローバル座標に変換できる

QDesktopWidget::screenGeometry()`

  • デメリット:やや複雑な処理が必要となる
  • メリット:マルチモニター環境でも適切に動作する

選択の指針

以下の表は、それぞれの方法の選択指針を示しています。

方法メリットデメリット適した状況
QCursor::pos()シンプルで使いやすいタッチスクリーンイベントには対応していないマウスカーソルの現在位置を取得したい場合
QWidget::mapToGlobal()ウィジェット座標をグローバル座標に変換できるイベントポイントではなく、ウィジェット自体の座標を対象としているウィジェットの位置をグローバル座標で取得したい場合
QDesktopWidget::screenGeometry()マルチモニター環境でも適切に動作するやや複雑な処理が必要となるマルチモニター環境でイベントポイントをグローバル座標に変換したい場合

具体的な例

以下の例は、QCursor::pos()を使用してマウスカーソルの現在位置をグローバル座標で取得するコードです。

QPointF globalPosition = QCursor::pos();
qDebug() << "Global position: " << globalPosition;

以下の例は、QWidget::mapToGlobal()を使用してウィジェット座標をグローバル座標に変換するコードです。

QWidget *widget = ...;
QPoint widgetPosition = widget->pos();
QPointF globalPosition = widget->mapToGlobal(widgetPosition);
qDebug() << "Global position: " << globalPosition;

以下の例は、QDesktopWidget::screenGeometry()を使用してイベントポイントをグローバル座標に変換するコードです。

QEventPoint point = ...;
QDesktopWidget *desktop = QApplication::desktop();
QRect screenGeometry = desktop->screenGeometry();
QPoint globalPosition = point.toPoint() + screenGeometry.topLeft();
qDebug() << "Global position: " << globalPosition;