Qt鼠标事件中的button()和buttons()的含义

QEvent类是所有事件类的基类,创建鼠标事件,MyLabel继承自QLabel

.h文件中声明如下:

#ifndef MYLABLE_H
#define MYLABLE_H

#include <QLabel>

class mylable : public QLabel
{
    Q_OBJECT
public:
    explicit mylable(QWidget *parent = 0);
    //鼠标进入
    void enterEvent(QEvent *);
    //鼠标离开
    void leaveEvent(QEvent *);
    //鼠标移动
     void	mouseMoveEvent(QMouseEvent * ev);
     //鼠标按压
     void	mousePressEvent(QMouseEvent * ev);
     //鼠标释放
     void	mouseReleaseEvent(QMouseEvent * ev);
     //时间分发器
     bool event(QEvent *e);
signals:

public slots:

};

#endif // MYLABLE_H

具体实现如下:

#include "mylable.h"
#include<QDebug>
#include<QMouseEvent>

mylable::mylable(QWidget *parent) :
    QLabel(parent)
{
}
//鼠标进入
void mylable::enterEvent(QEvent *)
{
   qDebug()<<"鼠标进入了" ;
}
//鼠标离开
void mylable::leaveEvent(QEvent *)
{
    qDebug()<<"鼠标离开了" ;
}
//鼠标移动
 void	mylable::mouseMoveEvent(QMouseEvent * ev)
 {
if(ev->buttons()&Qt::LeftButton){
     QString str=QString("鼠标移动了 x=  %1 y=  %2").arg(ev->x()).arg(ev->y());
     qDebug()<<str;
}
 }
 //鼠标按压
 void	mylable::mousePressEvent(QMouseEvent * ev)
 {
     if(ev->buttons()==Qt::LeftButton)
     {
         QString str=QString("鼠标按压了 x=  %1 y=  %2").arg(ev->x()).arg(ev->y());
         qDebug()<<str;
     }

 }
 //鼠标释放
 void	mylable::mouseReleaseEvent(QMouseEvent * ev)
 {if(ev->button()==Qt::LeftButton){
     qDebug()<<"鼠标释放了" ;}
 }

        这里重点关注鼠标按压、释放、移动三个时间的具体实现,if条件判断的是事件是否由鼠标左键触发,但若三个条件全部写成ev->button() == Qt::LeftButton,在运行的时候会发现,只有鼠标的点击和释放方法真正的打印了其中的内容,移动事件不做出反应。解决的方法是将原本的条件改为ev->buttons() == Qt::LeftButton这样,在点击鼠标左键后进行移动,就会有内容打印出来。这是因为button()仅仅返回的是触发事件时的按键,而buttons()返回的是鼠标的状态,包括鼠标左中右三键的联合信息。

        再者,使用ev->buttons() == Qt::LeftButton作为鼠标移动的判断条件时,若鼠标左键按下并移动一段距离后再同时按下鼠标右键,继续移动鼠标发现又无法正常打印其内容,解决方案是使用ev->buttons() & Qt::LeftButton来替换原来的条件,&在这里起到的作用是判断目前鼠标的联合状态中是否包含了鼠标左键,这样,同时按下左右键再移动鼠标,就会有正常的文字输出了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值