A good example that help you learn how to handle mouse events






After settings we got a new class named MyQLabel, which inherits from QWidget.

myqlabel.h


myqlabel.cpp



And now we replace QWidget with QLabel, as shown below

myqlabel.h

myqlabel.cpp







The label indeeds inherits from MyQLabel now.

Go back to myqlabel.h

Threre are three override events in QLabel, including mouseMoveEvent, mousePressEvent

and mouseRelaseEvent.





mainwindow.h


create four connections between sender (ui->lblMouse) and their receivers declared in the mainwindow

========================================================================

myqlabel.h

#ifndef MYQLABEL_H
#define MYQLABEL_H
 
#include <QLABEL>
#include <QMouseEvent>
#include <QEvent>
#include <QDebug>
 
class MyQLabel : public QLabel
{
    Q_OBJECT
public:
    explicit MyQLabel(QWidget *parent = nullptr);
    void mouseMoveEvent(QMouseEvent *ev) override;
    void mousePressEvent(QMouseEvent *ev) override;
    void mouseReleaseEvent(QMouseEvent *ev) override;
    void leaveEvent(QEvent *);
    int x, y;
 
signals:
    void Mouse_Pressed();
    void Mouse_Release();
    void Mouse_Move();
    void Mouse_Left();
};
 
#endif // MYQLABEL_H

myqlabel.cpp

#include "myqlabel.h"
 
MyQLabel::MyQLabel(QWidget *parent) : QLabel(parent)
{
 
}
 
void MyQLabel::mouseMoveEvent(QMouseEvent *ev)
{
    // get current mouse position
    this->x = ev->x();
    this->y = ev->y();
    emit Mouse_Move();
 
    qDebug() << "signal:: mouseMoveEvent";
}
 
void MyQLabel::mousePressEvent(QMouseEvent *ev)
{
    emit Mouse_Pressed();
    qDebug() << "signal:: mousePressEvent";
}
 
void MyQLabel::mouseReleaseEvent(QMouseEvent *ev)
{
    emit Mouse_Release();
    qDebug() << "signal:: mouseReleaseEvent";
}
 
void MyQLabel::leaveEvent(QEvent *)
{
    emit Mouse_Left();
    qDebug() << "signal::leaveEvent";
}
 

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
 
public slots:
    // receive singals emitted by a MyQLabel instance
    void Mouse_Pressed();
    void Mouse_Relese();
    void Mouse_Move();
    void Mouse_Left();
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect(ui->lblMouse, SIGNAL(Mouse_Move()), this, SLOT(Mouse_Move()));
    connect(ui->lblMouse, SIGNAL(Mouse_Pressed()), this, SLOT(Mouse_Pressed()));
    connect(ui->lblMouse, SIGNAL(Mouse_Release()), this, SLOT(Mouse_Relese()));
    connect(ui->lblMouse, SIGNAL(Mouse_Left()), this, SLOT(Mouse_Left()));
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
 
 
void MainWindow::Mouse_Pressed()
{
    ui->lblMouse_Current_Event->setText("Mouse Pressed!");
    qDebug() << "ui slot:: Mouse Pressed!";
}
 
void MainWindow::Mouse_Relese()
{
    ui->lblMouse_Current_Event->setText("Mouse Released!");
    qDebug() << "ui slot:: Mouse Released!";
}
 
void MainWindow::Mouse_Move()
{
     ui->lbl_Mouse_Current_Pos->setText(QString("X = %1, Y = %2").arg(ui->lblMouse->x).arg(ui->lblMouse->y));
     ui->lblMouse_Current_Event->setText("Mouse Moving!");
}
 
 
 
void MainWindow::Mouse_Left()
{
    ui->lblMouse_Current_Event->setText("Mouse Left!");
     qDebug() << "ui slot:: Mouse Left!";
}
 


References:

1. Qt Mouse Event on QLabel

2. 潮.C++20 | explicit 關鍵字大解析

文章標籤
全站熱搜
創作者介紹
創作者 me1237guy 的頭像
me1237guy

天天向上

me1237guy 發表在 痞客邦 留言(0) 人氣(758)