设置一个label范围使得鼠标可以在该范围中移动时打印相应得信息(鼠标进入,鼠标离开,鼠标按下,鼠标松开,鼠标移动)
自定义mylabel使其能够实现上述操作,右键点击项目点击添加新文件,选择C++ Class;当需要ui界面时选择Qt--->Qt设计器界面类进行添加。
在ui界面中添加label并将其提升为mylabel类型(注意:mylabel类型要与label类型一致 mylabel在创建时为QWidget,需要改为QLabel);
在mylabel.h文件中定义上述需要实现得功能函数,在mylabel.cpp中进行鼠标事件代码的具体实现。
mylabel.h文件代码:
#include <QLabel>//将状态提升时,要是基类与自定义类型一直(与基类保持一致)
class myLabel : public QLabel
{
Q_OBJECT
public:
explicit myLabel(QWidget *parent = nullptr);
//鼠标进入事件
void enterEvent(QEnterEvent * event);
//鼠标离开事件
void leaveEvent(QEvent *event);
//鼠标移动事件
void mouseMoveEvent(QMouseEvent *ev);
//鼠标按下事件
void mousePressEvent(QMouseEvent *ev);
//鼠标释放事件
void mouseReleaseEvent(QMouseEvent *ev);
//通过event事件分发器 拦截 鼠标按下事件
bool event(QEvent *e);
鼠标按下事件:判断是鼠标哪一个按键按下,当鼠标左键按下时打印语句if(ev->button == Qt::LeftButton)
鼠标移动事件:前提是鼠标按下,并且一定按下左键再进行移动
判断是否是鼠标左键一直按下,ev->buttons & Qt::LeftButton buttons包括左键右键滑轮三种类型
&操作保证一直是左键按下
mylabel.cpp代码:
void myLabel::enterEvent(QEnterEvent *event)
{
qDebug()<<"鼠标进入";
}
void myLabel::leaveEvent(QEvent *event)
{
qDebug()<<"鼠标离开";
}
void myLabel::mouseMoveEvent(QMouseEvent *ev)
{
// if(ev->button()==Qt::LeftButton)
// {
// qDebug()<<"鼠标移动";
// }不能实现
//鼠标左键按下进行移动打印数据
if(ev->buttons() & Qt::LeftButton)//buttons为联合按键包括(左中右)三种状态按键,&仅在左键按下时有效
{
QString str=QString("鼠标移动 x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
}
}
void myLabel::mousePressEvent(QMouseEvent *ev)
{
//QString str=QString("鼠标按下位置 x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalPos().y());
//qDebug()<<str;
//qDebug()<<"鼠标按下"<<"x="<<ev->position().x();
//鼠标左键按下打印语句
if(ev->button() == Qt::LeftButton)
{
QString str=QString("鼠标按下位置 x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalPos().x()).arg(ev->globalPos().y());
qDebug()<<str;
}
}
void myLabel::mouseReleaseEvent(QMouseEvent *ev)
{
if(ev->button()==Qt::LeftButton)
{
qDebug()<<"鼠标释放";
}
}
确定鼠标位置ev->position().x() 全局位置ev->globalX()
输出消息使用%1 %2 %3等占位符,再使用 .arg() 进行补充
事件分发器 event:
在自定义器件头文件中添加bool event();函数,在源文件中进行定义。可以将某些事件进行拦截。
//拦截鼠标按下事件
bool myLabel::event(QEvent *e)
if(e->type == QEvent::MouseButtonPress)
{
//静态类型转换 将QEvent类型转换为QMouseEvent类型
QMouseEvent * ev=static_cast<QMouseEvent*>(e);//将e得类型转为QMouseEvent类型
QString str=QString(% % %).arg(ev.position().x())
qDebug()<<str;
return true;
}
else
return QLabel::event(e); //其他事件 交给父类处理 默认处理
bool myLabel::event(QEvent *e)
{
// 将MousePressEvent事件拦截
if(e->type()==QEvent::MouseButtonPress)
{
//静态类型转换
QMouseEvent * ev=static_cast<QMouseEvent*>(e);//将e得类型转为QMouseEvent类型
QString str=QString("EVENT事件中,鼠标按下 x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
return true;//不向下进行分发
}
//其他事件 交给父类处理 默认处理
return QLabel::event(e);
}
事件过滤器eventFilter:
1.给控件安装事件过滤器,ui->label->installEventFilter(this)
//1.安装
ui->label->installEventFilter(this);
2.重写事件过滤函数eventFilter
bool myWidget::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->label)//确定器件
{
if(event->type == QEvent::QMouseButtonPress)//确定拦截事件
{
QMouseEvent * ev=static_cast<QMouseEvent *>(event);
QString str=QString("EVENTFILTER中, x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
return true;
}
return QWidget::eventFilter(watched,event);//其他交给父类默认处理
}
}
//2.重写eventFilter的事件
bool myWidget::eventFilter(QObject *watched, QEvent *event)
{
if(watched==ui->label)//确定器件
{
if(event->type()==QEvent::MouseButtonPress)//确定发生事件
{
QMouseEvent * ev=static_cast<QMouseEvent *>(event);
QString str=QString("EVENTFILTER中, x=%1 y=%2 all_x=%3 all_y=%4").arg(ev->position().x()).arg(ev->position().y()).arg(ev->globalX()).arg(ev->globalY());
qDebug()<<str;
return true;
}
}
return QWidget::eventFilter(watched,event);
}