Qt6学习笔记十(鼠标事件、事件分发器)

简介: Qt6学习笔记十(鼠标事件、事件分发器)

一、鼠标捕获事件

想要一个QLabel,可以捕获鼠标事件

如果不需要ui设置,仅仅只需要鼠标捕获,直接创建一个新的类c++ Class即可

基类选择QLabel的父类就行了

查阅文档可以知道,QWidget下有一个鼠标进入Wiget就可以触发的事件

直接复制过来就行了(因为是虚函数,要重写,注意要去掉作用域和virtual)

(QEnterEvent是QEvent的基类) (.h中2个地方改继承,.cpp中一个地方改继承)

在mylabel.h中定义事件

#ifndef MYLABEL_H
#define MYLABEL_H
#include <QLabel>//增加QLabel
class myLabel : public QLabel//修改继承为QLabel
{
    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = nullptr);
    //鼠标进入事件
    void enterEvent(QEnterEvent *event);
    //鼠标离开事件
    void leaveEvent(QEvent *event);
signals:
};
#endif // MYLABEL_H

在mylabel.cpp中实现

#include "mylabel.h"
#include<QDebug>
myLabel::myLabel(QWidget *parent)
    : QLabel{parent}
{
}
//鼠标进入事件
void myLabel::enterEvent(QEnterEvent *event){
    qDebug()<<"the mouse entered";
};
//鼠标离开事件
void myLabel::leaveEvent(QEvent *event){
    qDebug()<<"the mouse left";
};

然后在widget.ui中创建一个label,提升为myLabel

二、鼠标的按下、释放、移动

在文档中搜索QLabel,还能找到很多可以重新实现的事件

mylabel.h中

//鼠标按下
    void mousePressEvent(QMouseEvent *ev);
    //鼠标释放
    void mouseReleaseEvent(QMouseEvent *ev);
    //鼠标移动
    void mouseMoveEvent(QMouseEvent *ev);

mylabel.cpp中

//鼠标按下
void myLabel::mousePressEvent(QMouseEvent *ev){
    //当鼠标左键按下
    if(ev->button()==Qt::LeftButton){
        QString str = QString("the mouse pressed x=%1  y=%2  globalX=%3  globalY=%4")
                .arg(ev->pos().x()).arg(ev->pos().y()).arg(ev-> globalPosition().x()).arg(ev->globalPosition().y());//(可以文档搜索arg用法,链式编程)
        qDebug()<<str;
    }
};
//鼠标释放
void myLabel::mouseReleaseEvent(QMouseEvent *ev){
    //鼠标点击和释放是一种瞬时状态,用button(文档中button:Returns the button that caused the event)
    if(ev->button()==Qt::LeftButton){
        QString str = QString("the mouse released x=%1  y=%2  globalX=%3  globalY=%4")
                .arg(ev->pos().x()).arg(ev->pos().y()).arg(ev-> globalPosition().x()).arg(ev->globalPosition().y());
        qDebug()<<str;
    }
};
//鼠标移动
void myLabel::mouseMoveEvent(QMouseEvent *ev){
    //由于鼠标移动是一种状态,因此要用buttons,只是其中包含了左键按下这个状态。因此要用&。(文档中Returns the button state when the event was generated. The button state is a combination )
    if(ev->buttons()&Qt::LeftButton){
        QString str = QString("the mouse moved x=%1  y=%2  globalX=%3  globalY=%4")
                .arg(ev->pos().x()).arg(ev->pos().y()).arg(ev-> globalPosition().x()).arg(ev->globalPosition().y());
        qDebug()<<str;
    }
};

三、设置鼠标追踪状态

If mouse tracking is enabled, the widget receives mouse move events even if no buttons are pressed.

设置鼠标追踪状态为true,即使是没有任何按键按下,都可以触发move events(注意,之前的程序中,move事件中把点击左键的限制给去掉)

myLabel::myLabel(QWidget *parent)
    : QLabel{parent}
{
    //设置鼠标追踪状态
    setMouseTracking(true);
}

四、鼠标事件:总结

注意ev->x()这种已经不用了

ev->pos().x()

ev->pos().y()

ev-> globalPosition().x()

ev->globalPosition().y()


相关文章
|
2月前
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
111 3
(13) Qt事件系统(two)
|
2月前
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
96 0
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
793 4
【Qt 学习笔记】Qt窗口 | 标准对话框 | 消息对话框QMessageBox
|
4月前
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
238 4
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
880 4
|
4月前
|
数据安全/隐私保护
【Qt 学习笔记】Qt窗口 | 对话框 | 模态与非模态对话框的创建
【Qt 学习笔记】Qt窗口 | 对话框 | 模态与非模态对话框的创建
443 4
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 输入对话框QInputDialog
321 3
|
4月前
|
数据可视化
【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 字体对话框QFontDialog
104 3
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 颜色对话框QColorDialog
665 3
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
199 1