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

14 篇文章 10 订阅

一、鼠标捕获事件

想要一个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()

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菊头蝙蝠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值