我今天意识到,如果你有 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/