小阳同学嵌入式学习日记-Qt信号与槽机制

本文详细介绍了Qt中的信号与槽机制,包括其原理、旧式连接语法(使用字符串,类型不安全)和新式连接语法(编译时检查,更安全)。并给出了使用示例,强调新式语法的推荐使用。
摘要由CSDN通过智能技术生成

目录

一、什么是Qt信号与槽机制?

二、Qt 的旧式信号与槽连接语法

二、Qt 的新式信号与槽连接语法


一、什么是Qt信号与槽机制?

         Qt 信号与槽机制是一种用于处理对象间通信的机制,它是 Qt 中最重要的特性之一。通过信号与槽机制,一个对象可以向另一个对象发送信号,而另一个对象可以在接收到信号时执行相应的槽函数。这种机制极大地简化了对象之间的通信,使得代码的组织和管理更加灵活和清晰。

以下是信号与槽机制的一些重要概念和用法:

  • 信号(Signal):信号是一个对象的特殊成员函数,用于发出通知或事件。当对象的状态发生变化或特定条件满足时,它会发出一个信号,通知其他对象。

  • 槽(Slot):槽是一个普通的成员函数,用于接收信号并执行相应的操作。当对象接收到与其关联的信号时,会调用与之关联的槽函数。

  • 连接(Connect):连接是信号与槽之间的关联关系。通过连接,一个对象的信号可以与另一个对象的槽函数进行绑定,从而在信号触发时自动调用槽函数。

  • 发射信号(Emit Signal):当对象的信号发出时,会调用信号对应的特殊函数进行发射。这通常在对象的某个状态变化或某个条件满足时发生。

  • 连接语法:Qt 提供了两种连接信号与槽的语法,分别是旧式连接语法和新式连接语法。旧式连接语法使用 connect() 函数来建立连接,而新式连接语法使用 QObject::connect() 静态函数,连接是在运行时动态完成的。

二、Qt 的旧式信号与槽连接语法

         Qt 的旧式信号与槽连接语法是一种使用字符串来连接信号与槽的方法,它在运行时执行,无法进行编译时的类型检查。这种连接方式使用了宏和字符串,因此不够安全,并且容易出错。在新的 Qt 版本中,建议尽量使用新式信号与槽连接语法。

QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

其中:

  • sender 是发出信号的对象。
  • signal() 是发出的信号,它以字符串的形式表示信号的名称。
  • receiver 是接收信号的对象。
  • slot() 是接收到信号时要调用的槽函数,它以字符串的形式表示槽函数的名称。

 以下是一个使用旧式信号与槽连接语法的示例:

#include <QObject>
#include <QDebug>

class Sender : public QObject {
    Q_OBJECT
public slots:
    void sendSignal() {
        emit mySignal();
    }

signals:
    void mySignal();
};

class Receiver : public QObject {
    Q_OBJECT
public slots:
    void receiveSlot() {
        qDebug() << "Received signal";
    }
};

int main() {
    Sender sender;
    Receiver receiver;

    // 使用旧式语法连接 sender 对象的 mySignal() 信号与 receiver 对象的 receiveSlot() 槽函数
    QObject::connect(&sender, SIGNAL(mySignal()), &receiver, SLOT(receiveSlot()));

    // 发射信号
    sender.sendSignal();

    return 0;
}

         在这个示例中,我们使用了旧式信号与槽连接语法来连接信号与槽。需要注意的是,这种方式不够类型安全,且连接参数是字符串,因此容易出错,而且在编译时无法检查连接的有效性。因此,Qt 推荐尽量使用新式信号与槽连接语法。

二、Qt 的新式信号与槽连接语法

         新式语法是Qt5中引入的信号与槽连接语法,它在编译时检查连接的有效性,相比旧式语法更加类型安全。新式语法使用了C++11的特性,包括了Lambda表达式,使得信号与槽的连接更加简洁和直观。

新式语法的基本形式如下: 

QObject::connect(sender, &Sender::signal, receiver, &Receiver::slot);

其中:

  • sender 是发出信号的对象。
  • signal 是发出的信号,它必须是一个成员函数指针。
  • receiver 是接收信号的对象。
  • slot 是接收到信号时要调用的槽函数,它必须是一个成员函数指针。

除了成员函数指针外,还可以使用Lambda表达式作为槽函数。

以下是一个使用新式语法的示例: 

#include <QObject>
#include <QDebug>

class Sender : public QObject {
    Q_OBJECT
public slots:
    void sendSignal() {
        emit mySignal();
    }

signals:
    void mySignal();
};

class Receiver : public QObject {
    Q_OBJECT
public slots:
    void receiveSlot() {
        qDebug() << "Received signal";
    }
};

int main() {
    Sender sender;
    Receiver receiver;

    // 使用新式语法连接 sender 对象的 mySignal() 信号与 receiver 对象的 receiveSlot() 槽函数
    QObject::connect(&sender, &Sender::mySignal, &receiver, &Receiver::receiveSlot);

    // 发射信号
    sender.sendSignal();

    return 0;
}

        在这个示例中,我们使用了新式语法来连接信号与槽,代码更加简洁清晰,并且具有更好的类型安全性。

 

 做大做强,再创辉煌!

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值