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来替换原来的条件,&在这里起到的作用是判断目前鼠标的联合状态中是否包含了鼠标左键,这样,同时按下左右键再移动鼠标,就会有正常的文字输出了。