Qt信号可以公开还是私有?我可以创建只在课堂内看到的内部信号吗?
更新:我有一个带有一些内部信号的课程。如何让这些信号对其他类不可见(封装和信息隐藏)?
答案 0 :(得分:22)
没有。信号不能公开或私密。 Qt信号是受保护的类方法。
“signals”关键字在qobjectdefs.h中定义(第69行与Qt 4.6.1相同):
# define signals protected
UPDATE:信号仅为protected
,包括Qt 4的所有次要版本。从Qt 5.0开始,它们为public
。请参阅https://stackoverflow.com/a/19130831。
答案 1 :(得分:18)
一种常见的方式,例如在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();
这使信号变为私有,即它只能由类本身发出,而不能由其子类发出。为了不使“private:”否决Q_SIGNALS(moc不会将somePrivateSignal视为信号),它位于Q_MOC_RUN中,仅在moc运行时定义。
编辑:此方法不适用于Qt 5(connect(a, &A::someSignal, b, &B::someSlot)
)引入的新式连接,因为它们需要信号可访问。
答案 2 :(得分:14)
插槽是简单的方法,可以是公共的,受保护的或私有的。
正如安德烈指出的那样,信号只是对受保护的重新定义,这意味着它们只能由定义它们的类发出。
如果你想让一个类从anoter发出一个信号,你必须添加一个像这样的公共方法(或插槽):
void emitTheSignal(...) {
emit theSignal(...);
}
答案 3 :(得分:10)
Qt4中的信号为protected
,在Qt5中为public
。在Int Qt5中,您可以通过添加private
作为最后一个参数来使它们QPrivateSignal
。更多相关信息:http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html
答案 4 :(得分:5)
Qt信号是公共的,任何对象都可以连接到任何信号。
答案 5 :(得分:0)
您可以为此使用PIMPL模式。您的私有信号仅存在于私有实现中。
答案 6 :(得分:0)
所有现有答案都不正确。
可以通过在其定义中添加QPrivateSignal
类型作为最后一个参数来使信号私有:
signals:
void mySignal(QPrivateSignal);
QPrivateSignal
是由QObject
宏在每个Q_OBJECT
子类中创建的私有结构,因此您只能在当前类中创建QPrivateSignal
个对象。
从技术上讲,该信号仍然具有公众可见性,但是只能由创建它的类发出。