在项目开发中,难免遇到官方控件无法满足实际应用需求问题,此时就需要各位朋友们多多动脑和动手,成年人的生活啊,除了发胖和掉头发容易,其他都不容易。本文自定义重写Qt中QLabel控件类,实现鼠标事件功能。
目录
一、myclickLabel.cpp文件
/*myclickLabel.cpp*/
#include "myclicklabel.h"
#include <QDebug>
#include <QMoveEvent>
MyClickLabel::MyClickLabel(QWidget *parent):QLabel(parent)
{
}
//鼠标进入
void MyClickLabel::enterEvent(QEvent *event)
{
qDebug() << "提示:" << "鼠标进入";
emit myDoubleClicked();
}
//鼠离开
void MyClickLabel::leaveEvent(QEvent *event)
{
qDebug() << "提示:" << "当鼠离开";
emit myDoubleClicked();
}
//鼠标按下
void MyClickLabel::mousePressEvent(QMouseEvent *event)
{
QString Str=QString("按下位置:X=%1 Y=%2").arg(event->x()).arg(event->y());
//判断鼠标是按下左键还是右键
if(event->button()==Qt::LeftButton){
qDebug() << "提示:" << "鼠标按下左键"+Str;
emit myClicked();
}else{
qDebug() << "提示:" << "鼠标按下右键"+Str;
}
}
//鼠标释放
void MyClickLabel::mouseReleaseEvent(QMouseEvent *event)
{
//判断鼠标是按下左键还是右键
if(event->button()==Qt::LeftButton){
qDebug() << "提示:" << "鼠标释放左键";
}else{
qDebug() << "提示:" << "鼠标释放右键";
}
}
//鼠标移动
void MyClickLabel::mouseMoveEvent(QMouseEvent *event)
{
//持续状态 需要用buttons 用与操作符 进行判断
if(event->buttons()&Qt::LeftButton){
QString Str=QString("按下位置:X=%1 Y=%2").arg(event->x()).arg(event->y());
qDebug() << "提示:" << "鼠标移动"+Str;
}
}
//当鼠标双击的时候
void MyClickLabel::mouseDoubleClickEvent(QMouseEvent *event)
{
qDebug() << "提示:" << "当鼠标双击的时候,发出双击的信号";
emit myDoubleClicked();
}
二、myclickLabel.h文件
/*myclickLabel.h*/
#ifndef MYCLICKLABEL_H
#define MYCLICKLABEL_H
#include <QWidget>
#include <QLabel>
#include <QObject>
#include <QEvent>
#include <QMouseEvent>
class MyClickLabel : public QLabel
{
Q_OBJECT // must include this if you use Qt signals/slots
public:
explicit MyClickLabel(QWidget *parent = 0);
signals:
void myClicked(); // 单击产生的信号
void myDoubleClicked(); // 双击产生的信号
private:
void enterEvent(QEvent* event);// 鼠标进入事件
void leaveEvent(QEvent *event);//当鼠离开
void mousePressEvent(QMouseEvent* event); //鼠标按下
void mouseReleaseEvent(QMouseEvent *event);//鼠标释放
void mouseMoveEvent(QMouseEvent *event);//鼠标移动
void mouseDoubleClickEvent(QMouseEvent *event);// 鼠标双击事件
};
#endif // MYCLICKLABEL_H
三、QLabel控件继承自定义类MyClickLabel
如何对控件默认类调整为继承自定义类,请点击下方链接查看文章: Qt 中控件默认类修改为继承自定义类方法_TryRestart的博客-CSDN博客
四、调用
方法一:
connect(ui->label_touxiang, &MyClickLabel::myClicked, []() {
QMessageBox::warning(nullptr, "tip", "this is clickable label");
});
方法二:
connect(ui->label_touxiang, &MyClickLabel::myClicked, this, &MainWindow::label_touxiang);
五、说明
注意: ui->label_touxiang为控件对象名称,label_touxiang为调用的方法
不愿清醒,宁愿一直沉迷放纵。不知归路,宁愿一直无悔追逐。