close

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


image


image


image


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

myqlabel.h

image

myqlabel.cpp

image


And now we replace QWidget with QLabel, as shown below

myqlabel.h

image

myqlabel.cpp

image


image


image


image


The label indeeds inherits from MyQLabel now.

image

Go back to myqlabel.h

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

and mouseRelaseEvent.


image


image


image

image

mainwindow.h

image

image


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

image

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

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!";
}
 
image


References:

1. Qt Mouse Event on QLabel

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

arrow
arrow
    全站熱搜

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