为什么 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
实例,因为只有你知道那个.
我今天意识到,如果你有 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
实例,因为只有你知道那个.