QT学习笔记(十五):QLabel的点击事件(clicked)添加
Qt之添加QLabel的点击事件
QLabel功能为显示了一个字符串或者图片等信息,它本身没有click信号。也就不能够响应click点击事件,有什么办法来实现来,我们可以:
第一种方法:使用eventFilter事件过滤器
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 classreturn 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::RightButtonif(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);