为什么Qt默认信号公开?

时间:2019-04-23 20:59:56

标签: c++ qt signals slots

我今天意识到,如果您有3个这样的课程:

第1类有信号

第2类的信号连接到第3类的专用插槽

第3类有一个专用插槽,第2类是第3类的朋友

如果将第1类的信号连接到第2类的信号,则基本上可以通过发出第1类的信号来调用第3类的专用插槽。

如果信号是私有的或受保护的,则不会发生。

在另一种情况下,这种情况可能会很糟,想象一下我们有以下设置:

第1类有信号

第2类的信号连接到其受保护的基类插槽

第3类是具有受保护插槽的基类

这不是打破面向对象原则吗?

1 个答案:

答案 0 :(得分:3)

woboq提到了这一点:

  

信号在Qt4及更高版本中受到保护。它们在Qt5中公开,以启用the new syntax


您可以使用“ private”信号创建一个私有/受保护的帮助对象:

class Helper : public QObject
{
    Q_OBJECT
public:
    Helper(QObject *parent) : QObject(parent) { }
signals:
    void MyPrivateSignal();
};

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass()
        : QObject(),
        helper(new Helper(this))
    {
        connect(helper, &Helper::MyPrivateSignal, this, &MyClass::MyPrivateSlot);
    }

private slots:
    void MyPrivateSlot();

private:
    void InvokeMyPrivateSignal()
    {
        emit helper->MyPrivateSignal();
    }

private: // or protected:
    Helper *helper;
};

任何人都可以连接到Helper::MyPrivateSignal()实例的Helper,但是不能连接到您的 Helper实例,因为只有您知道那个实例。