Qt信号可以是公共的、受保护的或私有的吗?我能否创建内部信号,只在类内可见?
更新:我有一个带有一些内部信号的类。如何使这些信号对其他类不可见(封装和信息隐藏)?
Qt信号可以是公共的、受保护的或私有的吗?我能否创建内部信号,只在类内可见?
更新:我有一个带有一些内部信号的类。如何使这些信号对其他类不可见(封装和信息隐藏)?
# define signals protected
更新:信号(signals)在Qt 4的所有小版本中仅为protected
。从Qt 5.0开始,它们变为public
。请参见https://dev59.com/0mIk5IYBdhLWcg3wl_LE#19130831。
在Qt4中,Signals
是protected
的,在Qt5中它们是public
的。在Qt5中,通过将QPrivateSignal
添加为最后一个参数,您可以将它们设为private
。更多相关信息请参见:http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html
通常使用的方法,例如在kdelibs中看到的,是这样的:
Q_SIGNALS:
#ifndef Q_MOC_RUN
private: // don't tell moc, doxygen or kdevelop, but those signals are in fact private
#endif
void somePrivateSignal();
插槽是简单的方法,可以是公共的、受保护的或私有的。
正如Andrei所指出的,信号只是受保护的重新定义,这意味着它们只能由定义它们的类发射。
如果你想让一个类从另一个类发射信号,你需要添加一个公共方法(或插槽),像这样:
void emitTheSignal(...) {
emit theSignal(...);
}
qobjectdefs.h
中:#define signals protected
,所以不,信号并不是 public
。 - gregsethQ_SIGNAL
宏和正常的C++访问说明符来实现。protected:
Q_SIGNAL void myProtectedSignal();
private:
Q_SIGNAL void myPrivateSignal();
Qt信号的公共性在于任何对象都可以连接到任何信号。
所有现有的答案都是不正确的。
通过在信号的定义中添加QPrivateSignal
类型作为最后一个参数,可以将信号设为私有:
signals:
void mySignal(QPrivateSignal);
QPrivateSignal
是由 Q_OBJECT
宏在每个 QObject
子类中创建的私有结构体,因此只能在当前类中创建 QPrivateSignal
对象。
技术上,信号仍具有公共可见性,但它只能由创建它的类发射。