【Qt】信号与槽(下)

目录

自定义信号

 带参数的信号和槽

信号和槽存在的意义

信号与槽的连接方式

一对一

一对多

多对一

意义

信号和槽的其他说明

信号和槽的断开

使用Lambda表达式定义槽函数

信号与槽的优缺点

优点: 松散耦合

缺点: 效率较低


自定义信号

自定义槽函数是非常关键的,在开发中大部分情况都是需要自定义槽函数的。

槽函数,就是用户触发某个操作之后,要进行的业务逻辑

自定义信号,比较少见,在实际开发中很少会需要自定义信号。

信号就对应到用户的某个操作。

在GUI,用户能够进行哪些操作,是可以穷举的,在Qt中内置的信号,基本已经覆盖到了上述所有可能的用户操作。因此使用Qt内置的信号,旧足以应付大部分的开发场景。

widget这个类中虽然没有定义任何信号,由于继承自Qwidget和QObject,这俩个类里面已经提供了一些信号,可以直接使用。

所谓的Qt信号,本质上就是一个”函数“。

        Qt5已经更高版本中,槽函数和普通的成员函数之间已经没有区别;但是信号则是一类特殊的函数:

  1. 只需要写出函数声明,并且告诉Qt这是一个”信号“即可,这个函数的定义,是Qt在编译过程中,自动生成的(自动生成的过程,程序员无法进行干预)。因为信号在Qt中式特殊的机制,Qt生成的信号函数的实现,要配合Qt框架左很多既定的操作。
  2. 作为信号函数,这个函数的返回值,必须式void,有没有参数都可以,甚至也可以支持重载。

这个signals也是Qt自己扩展出来的关键字,在qmake的时候,调用一些代码的分析/生成工具,扫描到类中包含signals这个关键字的时候,此时,就会自动的把下面的函数声明认为是信号,并且给这些信号函数自动的生成函数定义。

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

signals:
    void mySignal();
    
public slots:
    void handleMySignaal();
    
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    connect(this, &Widget::mySignal, this, &Widget::setWindowTitle);
}

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

void Widget::handleMySignaal()
{
    this->setWindowTitle("自定义信号");
}

建立好联系之后,还需要将信号发送出去。

        对于Qt内置的信号,都不需要手动通过代码来触发,用户在GUI进行某些操作,就会自动触发对应信号(发射信号的代码已经内置到Qt框架中了)。

关键字:emit 发射

发射信号的操作,可以在任意合适的代码中。

这样就可以完成自定义信号了。

也可以通过点击按钮的方式,进行对窗口的编辑。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值