我今天意识到,如果您有3个这样的课程:
第1类有信号
第2类的信号连接到第3类的专用插槽
第3类有一个专用插槽,第2类是第3类的朋友
如果将第1类的信号连接到第2类的信号,则基本上可以通过发出第1类的信号来调用第3类的专用插槽。
如果信号是私有的或受保护的,则不会发生。
在另一种情况下,这种情况可能会很糟,想象一下我们有以下设置:
第1类有信号
第2类的信号连接到其受保护的基类插槽
第3类是具有受保护插槽的基类
这不是打破面向对象原则吗?
答案 0 :(得分:3)
woboq提到了这一点:
信号在Qt4及更高版本中受到保护。它们在Qt5中公开,以启用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::MyPrivateSignal()
实例的Helper
,但是不能连接到您的 Helper
实例,因为只有您知道那个实例。