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

https://blog.csdn.net/Vichael_Chan/article/details/100143032
Qt之添加QLabel的点击事件

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

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

在这里插入图片描述
1)头文件添加:

#include <QMouseEvent>

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

  • 1
  • 2
  • 3
  • 4

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);

<span class="token comment">// 修改标签文本格式</span>
ui<span class="token operator">-</span><span class="token operator">&gt;</span>label<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">setText</span><span class="token punctuation">(</span><span class="token function">tr</span><span class="token punctuation">(</span><span class="token string">"点击加载图片..."</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
ui<span class="token operator">-</span><span class="token operator">&gt;</span>label<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">setFont</span><span class="token punctuation">(</span><span class="token function">QFont</span><span class="token punctuation">(</span><span class="token string">"微软雅黑"</span><span class="token punctuation">,</span><span class="token number">20</span><span class="token punctuation">,</span>QFont<span class="token operator">:</span><span class="token operator">:</span>Bold<span class="token punctuation">,</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//ui-&gt;label-&gt;setStyleSheet("color:blue");  //文本颜色(前景色)</span>
ui<span class="token operator">-</span><span class="token operator">&gt;</span>label_1<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">setStyleSheet</span><span class="token punctuation">(</span><span class="token string">"color:blue; background-color:lightGray;"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//设置文本颜色+背景颜色(前景色)</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3)事件过滤器:

bool myWidget::eventFilter(QObject *obj, QEvent *event)
{
    if (obj == ui->label)//指定某个QLabel
     {
         if (event->type() == QEvent::MouseButtonPress) //鼠标点击
         {
             QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event); // 事件转换
         <span class="token keyword">if</span><span class="token punctuation">(</span>mouseEvent<span class="token operator">-</span><span class="token operator">&gt;</span><span class="token function">button</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">==</span> Qt<span class="token operator">:</span><span class="token operator">:</span>LeftButton<span class="token punctuation">)</span>
         <span class="token punctuation">{</span>
				<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>  <span class="token comment">// 添加代码</span>
				<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span>	<span class="token comment">// 添加代码</span>
             <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
         <span class="token punctuation">}</span>
         <span class="token keyword">else</span>
         <span class="token punctuation">{</span>
             <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
         <span class="token punctuation">}</span>
     <span class="token punctuation">}</span>
     <span class="token keyword">else</span>
     <span class="token punctuation">{</span>
         <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span>
     <span class="token punctuation">}</span>
 <span class="token punctuation">}</span>
 <span class="token keyword">else</span>
 <span class="token punctuation">{</span>
     <span class="token comment">// pass the event on to the parent class</span>
     <span class="token keyword">return</span> QWidget<span class="token operator">:</span><span class="token operator">:</span><span class="token function">eventFilter</span><span class="token punctuation">(</span>obj<span class="token punctuation">,</span> event<span class="token punctuation">)</span><span class="token punctuation">;</span>
 <span class="token punctuation">}</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

第二种方法:子类化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()函数
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

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); // 声明鼠标左击中信号

};

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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(); // 发射信号
}
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3)Widget.h头文件

#include "mylabel.h"

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

  • 1
  • 2
  • 3
  • 4

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<span class="token operator">:</span><span class="token operator">:</span><span class="token function">information</span><span class="token punctuation">(</span>NULL<span class="token punctuation">,</span><span class="token string">"单击"</span><span class="token punctuation">,</span><span class="token string">"单击了我"</span><span class="token punctuation">,</span>QMessageBox<span class="token operator">:</span><span class="token operator">:</span>Yes<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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

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

代码需要加上以下内容:

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

  
  
  • 1
  • 2
  • 3
  • 4
  • 5

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

 
发布了42 篇原创文章 · 获赞 148 · 访问量 41万+

猜你喜欢

转载自blog.csdn.net/baidu_37503452/article/details/104381426