首页 > 解决方案 > 是否允许通过指向另一个类的实例的指针发出信号?

问题描述

最小的例子:

class Foo : public QObject
{
    Q_OBJECT

signals:

    void
    TestSignal(int i) const;
};

class Bar : public QObject
{
    Q_OBJECT

public:

     Bar(Foo* foo) :
         mFoo{ foo }
     {}

    void
    TestEmit(int i) const
    {
        emit mFoo->TestSignal(i);
    }

private:

    Foo* mFoo;
};

void
Print(int i)
{
    std::cout << i << std::endl;
}

用法:

Foo aFoo;
Bar aBar{ &aFoo };

connect(&aFoo, &Foo::TestSignal, &Print);

aBar.TestEmit(1337);

所以我使用指向实例的指针Foo::TestSignal从函数发出信号。这似乎工作正常,但它允许吗?(如:可靠的定义行为)。Bar::TestEmitFoo

标签: c++qtqt-signals

解决方案


来自https://doc.qt.io/qt-5/signalsandslots.html

信号是公共访问函数,可以从任何地方发出,但我们建议只从定义信号的类及其子类中发出它们

我知道它在技术上是允许的和可靠的,但在代码设计方面不推荐。

您可能也有兴趣将信号连接到另一个,如此处所述https://doc.qt.io/qt-5/qobject.html#connect


推荐阅读