前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >初识Qt · 信号与槽总结

初识Qt · 信号与槽总结

作者头像
_lazy
发布2025-03-07 10:49:11
发布2025-03-07 10:49:11
9200
代码可运行
举报
文章被收录于专栏:Initial programmingInitial programming
运行总次数:0
代码可运行

前言:

对于信号和槽的部分我们这里算是大的知识点已经介绍完了,那么本文的重点就是放在对信号槽的一个总结,当然,对于信号和槽我们还有两个小的知识点没有介绍到,即disconnect和lambda表达式在这里的应用。在这里也会一并介绍到。

最后就是信号与槽的一个意义了,咱们了解即可~

disconnect和lambda表达式

咱们既然有了connect用来绑定信号和槽函数,自然而然就有取消绑定的函数,即disconnect,但是有一说一,在实际开发过程中,disconnect用的并不是那么常见,因为disconnect常见的场景都是将原来已经绑定好的信号槽取消绑定再换一个绑定,而大部分情况下呢,信号槽连接之后,就基本上不用管了,所以对于disconnect来说,咱们了解为重,以下是一个基本用法:

代码语言:javascript
代码运行次数:0
复制
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    connect(ui->pushButton,&QPushButton::clicked, this,&Widget::Handle_1);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::Handle_1()
{
    this->setWindowTitle("我是大王");
}

void Widget::Handle_2()
{
    this->setWindowTitle("我是小王");
}


void Widget::on_pushButton_2_clicked()
{
    disconnect(ui->pushButton,&QPushButton::clicked, this,&Widget::Handle_1);
    connect(ui->pushButton_2,&QPushButton::clicked, this,&Widget::Handle_2);
}

有个比较有意思的东西就是,当你第一次点击Button_2的时候,窗口的标题并不会修改,因为第一次是要取消连接并且建立连接,第二次点击就可以了。

以上是disconnect函数的基本用法。

接下来是lambda表达式。

使用lambda表达式之前我们不妨简单回忆以下lambda表达式怎么使用的:

代码语言:javascript
代码运行次数:0
复制
[capture](parameters) mutable -> return_type {
    // function body
}

其中返回值,参数列表,捕获列表都是可以省略的,但是为了防止我们忘了,那么我们不妨写全一点,以下是lambda表达式的一个基本使用:

代码语言:javascript
代码运行次数:0
复制
auto add = [](int a, int b) { return a + b; };
std::cout << add(2, 3) << std::endl;  // 输出: 5

那么你是否思考过为什么lamda表达式可以应用在Qt中吗?

说白了,Qt中的槽就是一个函数,lambda表达式就是一个精简版的函数,对于某些函数比较小,我们完全可以使用lamba表达式来实现。

代码语言:javascript
代码运行次数:0
复制
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // connect(ui->pushButton,&QPushButton::clicked, this,&Widget::Handle_1);
    QPushButton* button = new QPushButton(this);
    button->setText("按钮");
    button->move(200, 200);

    connect(button, &QPushButton::clicked,this,[](){
       qDebug() << "我复活啦!";
       button->move(100,100);
       this->move(100,100);
    });
}

此时这段代码是错误的,因为没有捕捉,可以理解lambda表达式里面的域是一个单独的,你想要使用外面的东西你就得给人拿进来:

代码语言:javascript
代码运行次数:0
复制
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    // connect(ui->pushButton,&QPushButton::clicked, this,&Widget::Handle_1);
    QPushButton* button = new QPushButton(this);
    button->setText("按钮");
    button->move(200, 200);

    connect(button, &QPushButton::clicked,this,[=](){
       qDebug() << "我复活啦!";
       button->move(100,100);
       this->move(100,100);
    });
}

这里直接选择全部捕获。

效果也是非常明显的,这个就非常有意思了。

当然了,因为lamda表达式是C++11中引用的,在Qt4的版本我们需要修改.pro文件才有用:

以上就是两个小的知识点的一个介绍。

信号与槽的总结 + 意义

1.理解基本的信号概念和槽的概念:

在这里我们理解到了Linux中的信号和Qt中的信号其实差别没有那么大,可以说挺像的,然后理解了信号和槽本质是一个函数。

2.信号槽的基本使用和如何查阅文档

在这里我们使用了connect函数,并且在文档中查阅发现clicked信号并不是PushButton发出来的,而是它继承的父类发出来的。

3.自定义槽函数和信号函数

在这里我们实现了槽函数的自定义和信号函数的自定义,并且理解了信号函数的一点特殊性,理解了自定义信号其实没有那么多人用~

4.信号槽存在的意义

解耦合:

在软件工程中,对象之间的耦合度就是对象之间的依赖性。对象之间的耦合越高,维护成本越高,因此对象的设计应使类和构件之间的耦合最小。解耦合正是通过设计策略和技术手段,将软件系统中不同组件之间的依赖关系降至最低,实现组件之间的松散耦合。简而言之,解耦合旨在使系统中的各个模块能够独立运行和变化,当一个模块修改时,其对系统其他部分的影响最小化。

5.disconnect的基本使用和lambda表达式的基本使用

在这里我们理解了两个小的知识点在Qt中的基本使用,对于一些一次性使用的函数我们常常写作为lambda表达式,对于disconnect,了解即可~~

感谢阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言:
  • disconnect和lambda表达式
  • 信号与槽的总结 + 意义
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档