首页 > 解决方案 > 用于对象间通信的 Qt 信号和插槽的替代方案

问题描述

使用类似 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);
}

标签: c++qt

解决方案


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

  1. 您可以开发自己的 Observer 结构,就像 Qt 信号和插槽一样,但您应该从头开始自己发明轮子。

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

    有关更多说明,请查看此链接

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

    有关更多解释,请查看


推荐阅读