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

标签 c++ qt signals slots

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

1 类有信号

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

类 3 有一个私有(private)插槽,类 2 是类 3 的 friend

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

如果信号是私有(private)的或 protected ,就不会发生这种情况。

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

1 类有信号

2 类有一个信号连接到它的基类保护槽

类 3 是具有 protected 插槽的基类

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

最佳答案

woboq提到这个:

Signals were protected in Qt4 and before. They are becoming public in Qt5 in order to enable the new syntax.


您可以使用“私有(private)”信号创建私有(private)/ protected 帮助对象:

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 实例,因为只有你知道那个。

关于c++ - 为什么Qt默认信号是公开的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55819365/

相关文章:

perl - 如何让 DBD::Pg 可靠地超时?

python - PyQt4:当鼠标在屏幕上的任何位置释放时发出信号

c++ - 地址、reinterpret_cast 和多重继承

c++ - 程序的本地/专用 sql 数据库

c++ - 将自定义标签添加到 TIFF 文件

c++ - 在布局上调整 QGraphicsView 小部件的大小

qt - 为 Visual Studio Community 2015 构建 Qt 5.6.0 时出错

C++ 结构和构造

python - 如何正确格式化QCompleter弹出列表的列表项?

linux - 我无法理解 sigaction() 结果