为什么Qt默认信号是公开的?

JCo*_*nce 1 c++ qt signals slots

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

1 类有信号

2 类有一个信号连接到 3 类的专用插槽

班级 3 有一个私人插槽,班级 2 是班级 3 的朋友

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

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

还有另一种情况可能会很糟糕,假设我们有这样的设置:

1 类有信号

2 类有一个连接到其基类受保护插槽的信号

class 3 是带有受保护槽的基类

这不是违反了面向对象的原则吗?

Mar*_*ngs 5

woboq提到了这一点:

Qt4 及之前的版本中信号受到保护。它们在 Qt5 中公开,以便启用新语法


您可以使用“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;
};
Run Code Online (Sandbox Code Playgroud)

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