QT学习笔记(十五):QLabel的点击事件(clicked)添加

QT学习笔记(十五):QLabel的点击事件(clicked)添加

Qt之添加QLabel的点击事件
QLabel功能为显示了一个字符串或者图片等信息,它本身没有click信号。也就不能够响应click点击事件,有什么办法来实现来,我们可以:

第一种方法:使用eventFilter事件过滤器

QT学习笔记(十五):QLabel的点击事件(clicked)添加_第1张图片
1)头文件添加:

#include <QMouseEvent>

public:
    bool eventFilter(QObject *obj, QEvent *event);	// 添加时间过滤器声明

2)构造函数添加:

myWidget::myWidget(QWidget *parent) :QWidget(parent),ui(new Ui::myWidget)
{
    ui->setupUi(this);
    ui->label->installEventFilter(this);    // 安装事件过滤器
    
//    QFont font ;
//    font.setFamily("微软雅黑"); //字体
//    font.setBold(true);  //加粗
//    font.setItalic(true);    //斜体
//    font.setStrikeOut(false); //删除线
//    font.setUnderline(true);   //下划线
//    font.setPointSize(23);   //字体大小
//    ui->label->setFont(font);

	// 修改标签文本格式
    ui->label->setText(tr("点击加载图片..."));
    ui->label->setFont(QFont("微软雅黑",20,QFont::Bold,true));
    //ui->label->setStyleSheet("color:blue");  //文本颜色(前景色)
    ui->label_1->setStyleSheet("color:blue; background-color:lightGray;");//设置文本颜色+背景颜色(前景色)
}

3)事件过滤器:

bool myWidget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == ui->label)//指定某个QLabel
     {
         if (event->type() == QEvent::MouseButtonPress) //鼠标点击
         {
             QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); // 事件转换

             if(mouseEvent->button() == Qt::LeftButton)
             {
					......  // 添加代码
					......	// 添加代码
                 return true;
             }
             else
             {
                 return false;
             }
         }
         else
         {
             return false;
         }
     }
     else
     {
         // pass the event on to the parent class
         return QWidget::eventFilter(obj, event);
     }
}

第二种方法:子类化QLabel+提升窗口部件,重写事件处理函数 mousePressEvent()或event()

1)mylabel.h 添加:

#include <QLabel>
#include <QMouseEvent>

class myLabel : public QLabel
{

    Q_OBJECT
public:
    explicit myLabel(QWidget *parent = 0);
    
protected:
   virtual void mousePressEvent(QMouseEvent *event);	// 重新声明 mousePressEvent 处理函数
   
protected:
   virtual bool event(QEvent *e);	// 声明 event()函数  
}

2)mylabel.cpp 添加:

#include "mylabel.h"
#include <QMessageBox>

// 重写鼠标点击事件 mousePressEvent()
void myLabel::mousePressEvent(QMouseEvent *event)
{
    //Qt::LeftButton
    //Qt::RightButton
    if(event->button()== Qt::LeftButton)
    {
        QMessageBox::information(NULL,"单击","单击了我", QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes);
    }
}
// 重写鼠标事件处理 event()
bool myLabel::event(QEvent *e)
{
    if (e->type() == QEvent::MouseButtonPress)
    {
        QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(e);
        if(mouseEvent->button() == Qt::LeftButton)
        {
            QMessageBox::information(NULL,"单击","单击了我",QMessageBox::Yes|QMessageBox::No,QMessageBox::Yes);
            return true;
        }
    }
    return QLabel::event(e);
}

第三种方法:信号与槽+提升窗口部件

1)mylabel.h 添加:

#include <QLabel>
#include <QMouseEvent>

class my_Label : public QLabel
{

    Q_OBJECT
public:
    explicit my_Label(QWidget *parent = 0);	// 构造函数声明
protected:
    virtual void mouseReleaseEvent(QMouseEvent * ev);  // 声明鼠标左键点击事件
signals:
    void clicked(void); // 声明鼠标左击中信号
    
};

2)mylabel.cpp 添加:

#include "mylabel.h"

my_Label::my_Label(QWidget *parent):QLabel(parent)
{

}

// 重写鼠标释放时间 mouseReleaseEvent()
void my_Label::mouseReleaseEvent(QMouseEvent *ev)
{
    Q_UNUSED(ev)
    if(ev->button() == Qt::LeftButton)
    {
        emit clicked();	// 发射信号
    }
}

3)Widget.h头文件

#include "mylabel.h"

private slots:
    void onClicked(); // 添加槽声明

4)Widget.cpp源文件

#include "myLabel.h"
#include <QMessageBox>

// 构造函数添加
Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 槽信号关联:
    //QObject::connect(ui->label, SIGNAL(clicked()), this, SLOT(onClicked()));	
    QObject::connect(ui->label, &my_Label::clicked, this, &Widget::onClicked);
}


// 槽函数:
void Widget::onClicked()
{	
	.......
	.......
	ui->pushButton_1->click();  // 关联pushButton_1按钮点击事件
	ui->pushButton_2->click();	// 关联pushButton_2按钮点击事件
	
    QMessageBox::information(NULL,"单击","单击了我",QMessageBox::Yes);
}

5)最后在设计模式提升窗口部件“label”为“myLabel”类。

PS:实际上一个完整的click点击事件,要处理down,move,releae三个事件。

代码需要加上以下内容:

...
public void MouseDownEvent(...)
public void MouseUpEvent(...)
public void MouseMoveEvent(...)
...

6)QT中发送鼠标点击事件

	QPoint pos=QPoint(5,5);
    QMouseEvent ev(QEvent::MouseButtonPress,pos,Qt::LeftButton,Qt::LeftButton, Qt::NoModifier);
    QCoreApplication::sendEvent(ui->pushButton,&ev);

你可能感兴趣的:(QT)