Qt的信号和槽机制

在C++中,对象与对象之间通信,要通过调用成员函数的方式来完成。而在Qt中提供了一种对象间的通信方式:信号与槽的机制。

Qt通过QObject来提供这个通信机制。它的工作方式也很简单,通过QObject对象提供的connect连接函数将信号与处理信号的函数进行绑定,当信号被发出时,绑定到这个信号的函数都会被调用。
槽(slot)本质上就是C++类的成员函数,它可以是任何成员函数、静态成员函数、全局函数、Lambda表达式。QObject的连接函数:

connect(sender,SIGNAL(signal),receiver,SLOT(slot));
  1. sender:发出信号的对象
  2. signal:发出的信号
  3. receiver:接收信号的对象
  4. slot:处理信号的函数

一个信号可以绑定到多个槽函数:

connect(sender,SIGNAL(signal),receiver,SLOT(slot1));
connect(sender,SIGNAL(signal),receiver,SLOT(slot2));

多个信号可以绑定到同一个槽函数:

connect(sender,SIGNAL(signal1),receiver,SLOT(slot));
connect(sender,SIGNAL(signal2),receiver,SLOT(slot));

一个信号还可以连接到另一个信号:

connect(sender,SIGNAL(signal1),receiver,SIGNAL(signal2));

解除信号与槽函数之间的绑定:

disconnect(sender,SIGNAL(signal),receiver,SLOT(slot));

注意:信号与槽机制同真正的回调函数相比,时间的消耗还是非常大的,在实时系统(嵌入式实时系统)中要少用,甚至不用。

举个使用信号与槽机制通信的Qt例子:
sender.h

#ifndef SENDER_H
#define SENDER_H

#include <QWidget>

class Sender : public QWidget
{
    Q_OBJECT // 只有继承了QObject类的类才具备使用信号和槽机制通信的能力。
public:
    explicit Sender(){};
    void send(const QString &name);

signals:
    void message(const QString &name);//自定义的信号,它只有是一个函数声明,不需要实现,要求返回类型必须是void。

};

#endif // SENDER_H

receiver.h

#ifndef RECEIVER_H
#define RECEIVER_H

#include <QWidget>

class Receiver : public QWidget
{
    Q_OBJECT
public:
    explicit Receiver(){};
    ~Receiver(){};
    void receive(const QString &msg);

};

#endif // RECEIVER_H

sender.cpp

#include "sender.h"

void Sender::send(const QString &name){
    emit message(name); // 使用emit发送信号
}

receiver.cpp

#include "receiver.h"

void Receiver::receive(const QString &name){
    qDebug()<< "received message:"<< name;
}

main.cpp

#include "myslot.h"
#include "sender.h"
#include "receiver.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Sender sender;//发送者
    Receiver receiver;//接收者
    QObject::connect(&sender,&Sender::message,&receiver,&Receiver::receive);//信号与槽函数的绑定
    sender.send("hello world");//发送信息
    return a.exec();
}

输出:

 received message: "hello world"
  • 参与使用信号与槽机制通信的类都必须继承QObject类(即发送者与接收者都要继承QObject类),只有继承了QObject类的类才具备使用信号和槽机制通信的能。
  • 自定义的信号,它只有是一个函数声明,不需要实现,要求返回类型必须是void。
  • 使用emit发送信号
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt信号机制是其最重要的特性之一,它提供了一种灵活而高效的通信方式。信号可以在不同对象之间进行通信,使得这些对象能够相互响应和交互。 信号Qt定义的一种特殊的函数,用于表示某个事件的发生。一个类可以定义一个多个信号信号可以在特定的情况下被触发,比如用户点击了一个按钮或者其他的操作发生了一些特定的事件。信号的声明通常位于类的头文件一个特殊的成员函数,用于接收信号并对其进行响应。一个类可以定义一个多个函数,用于处理不同的信号函数可以有任意的参数和返回值,但是需要与信号的参数列表和返回值类型匹配。函数的声明通常位于类的头文件或者源文件信号通过Qt的元对象系统来进行连接。当信号被触发时,与之相关联的函数会被调用。信号之间的连接可以通过Qt提供的connect函数来实现,也可以在Qt Creator通过可视化界面来进行连接信号之间的连接是动态的,可以在运行时进行创建、修改和断开。这种机制使得对象之间的通信变得非常灵活,能够很好地支持Qt的事件驱动编程模型。 总结起来,Qt信号机制是一种通过信号函数来实现对象间通信的灵活机制信号用于表示事件的发生,函数用于对信号进行响应。通过Qt的元对象系统,可以在运行时动态地连接、修改和断开信号之间的关联。这种机制使得对象之间的通信变得简单而高效。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值