【问题标题】:Is it allowed to emit a signal trough a pointer to an instance of another class?是否允许通过指向另一个类的实例的指针发出信号?
【发布时间】:2021-12-24 01:41:41
【问题描述】:

小例子:

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 实例的指针从函数Bar::TestEmit 发出信号Foo::TestSignal。这似乎工作正常,但允许吗? (如:可靠的定义行为)。

【问题讨论】:

  • 我看不出显示的代码有什么问题。你有什么特别的理由质疑这种行为吗?
  • @G.M.从技术上讲,信号是从它们所属的类的“内部”发出的。所以这可能算作某种滥用,只是碰巧起作用,但不能依赖(?)。只是想确保 - 我在文档中找不到太多关于这种情况的信息。

标签: c++ qt qt-signals


【解决方案1】:

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

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

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

您可能也有兴趣按照此处https://doc.qt.io/qt-5/qobject.html#connect 的说明将信号连接到另一个信号

【讨论】:

    猜你喜欢
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 2020-04-12
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多