如何自学qt(9)——鼠标响应

在写鼠标事件之前,我们先按(8)的方法造一个mylabel控件,并把它应用在主窗口
在这里插入图片描述
【为了方便看,我给这个label加了黑框,修改位置在这里】
在这里插入图片描述
然后就可以开始写鼠标事件了
遇事不决,先查文档
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到,qt提供了鼠标事件的五种操作,分别是移动,摁压,释放(图1),进入(图2),和离开(图3)
而且,这是一种虚函数——这就说明,我们要自己实现它。
先在mylabel的头文件里面写声明

//mylabel.h
public:
    explicit mylabel(QWidget *parent = nullptr);
    //鼠标进入事件
    void enterEvent(QEvent *event);
    //鼠标离开事件
    void leaveEvent(QEvent *event);
    //鼠标摁压事件
    void mousePressEvent(QMouseEvent *ev);
    //鼠标释放事件
    void mouseReleaseEvent(QMouseEvent *ev);
    //鼠标移动事件
    void mouseMoveEvent(QMouseEvent *ev);

然后,在cpp文件中实现
以进入为例

//mylabel.cpp
//鼠标进入事件
void mylabel::enterEvent(QEvent *event)
{
    qDebug() << "进入";
}

当然,也可以做一些特殊设定,比如左键摁压才打印

//mylabel.cpp
//鼠标摁压事件
void mylabel::mousePressEvent(QMouseEvent *ev)
{
    if(ev->button() == Qt::LeftButton)
    {
        QString str = QString("鼠标坐标 x = %1 y = %2").arg(ev->globalX()).arg(ev->globalY());
        qDebug() << str;
    }
}

查一下文档,属于鼠标的枚举有三个,leftbutton,rightbutton和midbutton对应左右中
这里用了qt的链式字符输入,类似于format(),需要填充的地方写%数字,后面以.连接要添加的字符
通过查询帮助文档,我们可以知道,QMouseEvent是有两个坐标参量的,一个是在控件里的坐标x,y。另一个是在全屏幕(不是父窗口)的globalx,globaly
这里用的就是后者
【可以用这个看一下自己电脑屏幕有多大】
有一个地方需要注意,就是移动是不能这么直接判断的,要这样

//mylabel.cpp
//鼠标移动事件
void mylabel::mouseMoveEvent(QMouseEvent *ev)
{
    if(ev->buttons() & Qt::LeftButton)
    {
    qDebug() << "移动";
    }
}

因为移动是个持续状态,要用位处理符来判断是否有一起移动的情况
最后,我们学习一个跟踪函数,可以写在mylabel的主窗体里

//mylabel.cpp
mylabel::mylabel(QWidget *parent) : QLabel(parent)
{
    //设置鼠标追踪
    setMouseTracking(true);
}

这个参数默认为false,如果设置了,在移动事件里不用点击也可以判定移动,非常方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值