C++ 用于对象间通信的Qt信号和插槽的替代方案

C++ 用于对象间通信的Qt信号和插槽的替代方案,c++,qt,C++,Qt,除了在两个方向上的两个对象(类实例)之间使用类似Qt的信号和插槽进行通信,还有什么替代方法 我知道这可以通过在每个对象中保存另一个对象的引用来实现。然而,当存在许多不同的对象并且所有对象都应该相互作用(从而相互了解)时,这就有点令人困惑了 我遇到的另一个问题是Qt信号和插槽如何在内部实现这种对象间通信(简单概述一下内部事件过程会很有帮助) 下面是我所说的一个例子。两个对象c和d都可以发出一个信号,该信号连接到另一个对象的插槽 class Chicken : public QObject {

除了在两个方向上的两个对象(类实例)之间使用类似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);
}
类鸡:公共QObject
{
Q_对象
公众:
鸡肉()=默认值;
公众时段:
void helloBackDuck(){

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

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

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

    有关更多解释,请查看此项

  • 另一个选项是使用Boost signal2,它也类似于Qt信号插槽,但来自第三方库。用法类似于Qt信号

    更多解释请查看


  • Qt内部可以最好地在Qt源代码中查找,但是从很高的层次来看,每个QoObject都有一个它所连接的对象列表,发出一个信号意味着遍历该列表,检查每个连接的信号,然后调用一个成员函数。什么样的“备选方案”你在寻找信号和插槽吗?信号和插槽在进程中工作。你想要进程外的替代方案吗?如果不是:你确定要使用Qt吗?因为GTK、Copperspice或wx也会给你一些模糊的相似的东西。写明确的指针纠结代码(你称之为“有点混乱”)也是如此。请澄清你想要的方向(也许会说为什么Qt信号/插槽不适合你)。我不确定我是否理解这个问题。使用
    Qt
    信号/插槽有什么问题?你想解决的实际问题是什么?谢谢@AdriaandeGroot,这让我更好地理解了什么是“魔法”发生在Qt内部。我对Qt信号和插槽一点问题都没有。这更像是一个编程理论类的问题。我在问自己是否还有其他方法我还没有找到。进程外到底是什么意思?谢谢你们!Qt是如何工作的:以及其中的引用