好久没碰QT了 突然写到label控件,发现本身没有点击信号
,我们需要自己实现。
有以下两种
(1)继承QLabel类重构鼠标事件,在事件中发送自定义信号,从而构建信号槽,通过信号槽机制实现点击效果
.h文件
#include <QWidget>
#include <QLabel>
#include <QCheckBox>
#include <QGridLayout>
#include <QMouseEvent>
class mylabel;
//继承QLabel
class mylabel:public QLabel
{
Q_OBJECT
public:
mylabel(){}
signals:
void chilked(); //声名信号
private:
//本文选择的是释放事件,对于鼠标按下和移入也可以
void mouseReleaseEvent(QMouseEvent * ev) //鼠标释放事件
{
if(ev != nullptr)
//判断事件是否为鼠标左键
if(ev->button() == Qt::LeftButton)
{
emit chilked(); // 发射信号
}
}
};
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = 0);
~Widget();
public slots:
void slotdianji(); //槽函数
private:
mylabel *label = nullptr ; //使用自己的类
QGridLayout * layout = nullptr;
};
.cpp文件
#include "widget.h"
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
this->resize(150,50);
if(label == nullptr)
label = new mylabel;
label->setText("label");
if(layout == nullptr)
layout = new QGridLayout(this);
layout->addWidget(label);
//连接信号槽,连接类中的自定义信号 chilked.
connect(label,SIGNAL(chilked()),this,SLOT(slotdianji()));
}
Widget::~Widget()
{
}
void Widget::slotdianji()
{
qDebug()<<"点击了label";
}
(2)使用QT提供的事件过滤器,使用bool eventFilter(QObject *obj,QEvent *event)和 installEventFilter()。
.h文件
#include <QWidget>
#include <QLabel>
#include <QMouseEvent>
#include <QGridLayout>
class lablewidget:public QWidget
{
Q_OBJECT
public:
lablewidget();
bool eventFilter(QObject *obj,QEvent *event);//声名使用过滤器
QLabel *my_label = nullptr;
QGridLayout * layout = nullptr;
};
.cpp文件
#include "lablewidget.h"
#include <QDebug>
lablewidget::lablewidget()
{
this->resize(150,50);
if(my_label == nullptr)
my_label = new QLabel(this);
my_label->setText("label");
my_label->installEventFilter(this); //给控件安装事件过滤器
if(layout == nullptr)
layout = new QGridLayout(this);
layout->addWidget(my_label);
}
bool lablewidget::eventFilter(QObject *obj, QEvent *event)
{
//判断对象是否为my_label
if(obj == this->my_label)
{
//判断事件类型是否为鼠标事件
if(event->type() == QEvent::MouseButtonPress)
{
//转换为鼠标事件
QMouseEvent *mouseenevt = static_cast<QMouseEvent*>(event);
//判断鼠标左键点击
if(mouseenevt->button() == Qt::LeftButton)
{
qDebug()<<"点击了label";
return true;
}
}
}
return false;
}