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