QLabel点击事件

好久没碰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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值