用于对象间通信的Qt信号和时隙的替代方案

Alternatives to Qt Signals and Slots for Inter-Object Communication

本文关键字:时隙 方案 Qt 对象 通信 用于 信号      更新时间:2024-09-27

除了使用类似Qt的信号和插槽在两个对象(类实例(之间双向通信之外,还有什么替代方案?

我知道这可以通过在每个对象中保存另一个对象的引用来实现。然而,当存在许多不同的对象,并且所有对象都应该相互交互(从而了解(时,这会有点令人困惑。

我遇到的另一个问题是Qt信号和插槽是如何在内部实现这种对象间通信的(简单概述一下内部事件过程会很有帮助(?

下面是我所说的一个Qt例子。对象c和d都可以发出连接到另一个插槽的信号。

class Chicken : public QObject
{
Q_OBJECT
public:
Chicken() = default;
public slots:
void helloBackDuck() {
std::cout << "Hello Back Duck" << std::endl;
}

signals:
void helloDuck();
};
class Duck : public QObject
{
Q_OBJECT
public:
Duck() = default;
public slots:
void helloBackChicken() {
std::cout << "Hello Back Chicken" << std::endl;
}

signals:
void helloChicken();
};
int main() {
Chicken c;
Duck d;

connect(&c, &Chicken::helloDuck, &d, &Duck::helloBackChicken);
connect(&d, &Duck::helloChicken, &c, &Chicken::helloBackDuck);
}

Qt信号和插槽机制是Qt程序中的最佳选择,但如果您想了解其他选项,您可以使用以下选项:

  1. 你可以开发自己的观察者结构,就像Qt信号和槽一样,但你应该从一开始就自己发明轮子。

    您应该创建一个Observe类和一个Subject类。一开始,通过将Observer的引用传递给Subject来连接Observer,一旦条件满足,Subject就会调用所有实例的更新函数(emit(。

    有关更多解释,请查看此链接。

  2. 另一种选择是使用Boost signal2,它也类似于Qt信号槽,但来自第三方库。用法类似于Qt信号。

    要了解更多解释,请查看此。