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. 実装例
- マウスボタンが押下/解放されたときに対応する状態インジケーターの色を変更
- マウスダブルクリック時にダイアログを表示
- マウス移動時に現在の座標を表示
// ヘッダーファイル
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);
}
}