为什么 Qt 默认信号为 public?

Why does Qt default signals to be public?

我今天意识到,如果你有 3 个 class 是这样的:

class1个有信号

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

class 3 有一个私人插槽并且 class 2 是 class 3

的朋友

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

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

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

class1个有信号

class 2 有一个信号连接到它的底座 classes protected slot

class 3 是基数 class 带有受保护的插槽

这不是破坏了面向对象的原则吗?

woboq 提到了这个:

Signals were protected in Qt4 and before. They are becoming public in Qt5 in order to enable 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 实例的 Helper::MyPrivateSignal(),但不能连接到 你的 Helper 实例,因为只有你知道那个.