Qt マウスイベント処理

Qt マウスイベント処理

1. マウスイベントの種類

  • マウス押下
  • マウス解放
  • マウスダブルクリック
  • マウス移動

対応するオーバーライド関数: マウス押下: void mousePressEvent(QMouseEvent *event) override

マウス解放: void mouseReleaseEvent(QMouseEvent *event) override

マウスダブルクリック: void mouseDoubleClickEvent(QMouseEvent *event) override

マウス移動: void mouseMoveEvent(QMouseEvent *event) override

2. QMouseEventの主なメソッド

// イベント発生時のマウスボタンを取得(左ボタン、中ボタン、右ボタン)
Qt::MouseButton button() const
// イベントのグローバル位置X座標を取得
int globalX() const
// イベントのグローバル位置Y座標を取得
int globalY() const
// イベントの現在のウィジェット位置X座標を取得
int x() const
// イベントの現在のウィジェット位置Y座標を取得
int y() const
// イベントタイプを取得(押下、解放、ダブルクリックなど)
QEvent::Type type() const

これらのメソッドはQMouseEventクラスの一部です。詳細は公式ドキュメントを参照してください。

3. 実装例

  1. マウスボタンが押下/解放されたときに対応する状態インジケーターの色を変更
  2. マウスダブルクリック時にダイアログを表示
  3. マウス移動時に現在の座標を表示
// ヘッダーファイル
class MouseEventDemo : public QMainWindow
{
    Q_OBJECT

public:
    MouseEventDemo(QWidget *parent = nullptr);
    ~MouseEventDemo();

protected:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void mouseDoubleClickEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;

private:
    void updateLeftButtonState(bool isPressed);
    void updateMiddleButtonState(bool isPressed);
    void updateRightButtonState(bool isPressed);

private:
    Ui::MouseEventDemo *ui;
};

// 実装ファイル

#include "MouseEventDemo.h"
#include "ui_MouseEventDemo.h"
#include <QMouseEvent>
#include <QMessageBox>
#include <QString>

// スタイルシート定数
const QString PRESS_STYLE = "QLabel{border:1px solid #A6A6A6;border-radius:12px;color:black;background-color:#00ff00;}";
const QString RELEASE_STYLE = "QLabel{border:1px solid #A6A6A6;border-radius:12px;color:black;background-color:#ff0000;}";

MouseEventDemo::MouseEventDemo(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MouseEventDemo)
{
    ui->setupUi(this);

    // 初期状態設定
    updateLeftButtonState(false);
    updateMiddleButtonState(false);
    updateRightButtonState(false);
}

MouseEventDemo::~MouseEventDemo()
{
    delete ui;
}

void MouseEventDemo::mousePressEvent(QMouseEvent *event)
{
    switch (event->button()) {
    case Qt::LeftButton:
        updateLeftButtonState(true);
        break;
    case Qt::MiddleButton:
        updateMiddleButtonState(true);
        break;
    case Qt::RightButton:
        updateRightButtonState(true);
        break;
    default:
        break;
    }

    QMainWindow::mousePressEvent(event);
}

void MouseEventDemo::mouseReleaseEvent(QMouseEvent *event)
{
    switch (event->button()) {
    case Qt::LeftButton:
        updateLeftButtonState(false);
        break;
    case Qt::MiddleButton:
        updateMiddleButtonState(false);
        break;
    case Qt::RightButton:
        updateRightButtonState(false);
        break;
    default:
        break;
    }

    QMainWindow::mouseReleaseEvent(event);
}

void MouseEventDemo::mouseDoubleClickEvent(QMouseEvent *event)
{
    QMessageBox::information(this, "ダブルクリック情報", 
                            QString("マウス位置: X = %1, Y = %2").arg(event->x()).arg(event->y()));
    QMainWindow::mouseDoubleClickEvent(event);
}

void MouseEventDemo::mouseMoveEvent(QMouseEvent *event)
{
    // マウス座標を更新
    ui->labelX->setText(QString::number(event->x()));
    ui->labelY->setText(QString::number(event->y()));

    QMainWindow::mouseMoveEvent(event);
}

void MouseEventDemo::updateLeftButtonState(bool isPressed)
{
    if (isPressed) {
        ui->leftPressedLabel->setStyleSheet(PRESS_STYLE);
        ui->leftReleasedLabel->setStyleSheet(RELEASE_STYLE);
    } else {
        ui->leftPressedLabel->setStyleSheet(RELEASE_STYLE);
        ui->leftReleasedLabel->setStyleSheet(PRESS_STYLE);
    }
}

void MouseEventDemo::updateMiddleButtonState(bool isPressed)
{
    if (isPressed) {
        ui->middlePressedLabel->setStyleSheet(PRESS_STYLE);
        ui->middleReleasedLabel->setStyleSheet(RELEASE_STYLE);
    } else {
        ui->middlePressedLabel->setStyleSheet(RELEASE_STYLE);
        ui->middleReleasedLabel->setStyleSheet(PRESS_STYLE);
    }
}

void MouseEventDemo::updateRightButtonState(bool isPressed)
{
    if (isPressed) {
        ui->rightPressedLabel->setStyleSheet(PRESS_STYLE);
        ui->rightReleasedLabel->setStyleSheet(RELEASE_STYLE);
    } else {
        ui->rightPressedLabel->setStyleSheet(RELEASE_STYLE);
        ui->rightReleasedLabel->setStyleSheet(PRESS_STYLE);
    }
}

タグ: Qt C++ GUI EventHandling MouseEvents

6月24日 19:27 投稿