【Qt】对象之间信息交互

1、对象之间交互的方式

C++对象之间通信的几种方式
C++对象之间通信的三种常见方式
几种回调的对比

(1)B是A的成员变量。A可随便调用B的接口,但B不能调用A(除非传指针),信号槽关联相互调用。
(2)A和B的对象在第三方类中。信号槽关联相互调用。
(3)继承虚接口
(4)消息总线(观察者模式)

2、消息总线(同步,关心结果)

2.1 ICallback

2.2 IDataBus

2.3 IMessage

2、消息总线(异步,不关心结果)

基于 Qt 实现消息总线
代码:https://github.com/cmguo/QtEventBus

3、工程应用

C++11 MessageBus–消息队列实现(同书上代码)
C++的阻塞式消息总线message_bus实现(c++17同上)

思想: 以接收函数为主,发送只传递相关参数。

#include "messagebus.h"
#include <iostream>
std::multimap<std::string, std::any> MessageBus::m_map;
// 使用boost的使用 std::multimap<std::string, boost::any> MessageBus::m_map;

class Test
{
public:
    void test(int, const char*) { 
		std::cout<< "hit test" << std::endl; 
		return;
	}
};
int main()
{
    Test t;
	std::string key = "test";
    // 订阅"test"消息,参数为:主题为key,回调函数为Test::test,类对像是t(不是指针)
    g_messagebus.attach<int, const char*>(key, &Test::test, t); 
    // 向订阅者发送消息,消息参数是 123 和 "abc",回调函数Test::test将会被执行
    g_messagebus.sendMessage<int, const char*>(key, 123, "abc"); 
    // 移除订阅"test"
    g_messagebus.remove<int, const char*>(key); 
    return 0;
}

使用C++11实现的非阻塞消息总线message_bus

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt 中,子线程之间可以通过信号和槽(signals and slots)来交互数据。下面是一个示例代码,演示了两个子线程之间的数据交互: ```cpp #include <QThread> #include <QDebug> // 第一个子线程 class WorkerThread1 : public QThread { Q_OBJECT public: void run() override { qDebug() << "WorkerThread1 开始运行"; // 模拟耗时操作 sleep(2); // 发送信号给第二个子线程 emit dataReady("Hello from WorkerThread1"); qDebug() << "WorkerThread1 运行结束"; } signals: void dataReady(const QString& data); }; // 第二个子线程 class WorkerThread2 : public QThread { Q_OBJECT public slots: void handleData(const QString& data) { qDebug() << "WorkerThread2 收到数据:" << data; } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); WorkerThread1 workerThread1; WorkerThread2 workerThread2; // 连接信号和槽 QObject::connect(&workerThread1, &WorkerThread1::dataReady, &workerThread2, &WorkerThread2::handleData); // 启动两个子线程 workerThread1.start(); workerThread2.start(); return a.exec(); } #include "main.moc" ``` 在上面的示例中,`WorkerThread1` 是第一个子线程,它在 `run` 函数中执行一些耗时操作,并通过信号 `dataReady` 发送数据给第二个子线程。`WorkerThread2` 是第二个子线程,它定义了一个槽函数 `handleData` 来处理接收到的数据。 在 `main` 函数中,我们创建了两个子线程的实例 `workerThread1` 和 `workerThread2`,然后使用 `QObject::connect` 函数将第一个子线程的信号 `dataReady` 连接到第二个子线程的槽函数 `handleData`。这样,当第一个子线程发送数据时,第二个子线程会接收到并处理。 运行代码后,你将看到输出中显示第二个子线程收到了来自第一个子线程的数据。这就是两个子线程之间的数据交互。请注意,为了使信号和槽能够工作,需要在类定义前加上 `Q_OBJECT` 宏,并在文件末尾添加 `#include "main.moc"` 来启用 Qt 的元对象编译器(MOC)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值