小智 25
不可以.信号不能公开或私密.Qt信号是受保护的类方法.
"signals"关键字在qobjectdefs.h中定义(第69行与Qt 4.6.1相同):
# define signals protected
Run Code Online (Sandbox Code Playgroud)
更新:信号仅protected包括Qt 4的所有次要版本.从Qt 5.0起,它们是public.请参阅/sf/answers/1339158201/.
Fra*_*eld 20
一种常见的方式,例如在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();
Run Code Online (Sandbox Code Playgroud)
这使信号变为私有,即它只能由类本身发出,而不能由其子类发出.为了不使"private:"否决Q_SIGNALS(moc不会将somePrivateSignal视为信号),它位于Q_MOC_RUN内部,仅在moc运行时定义.
编辑:这种方法不适用于Qt 5(connect(a, &A::someSignal, b, &B::someSlot))引入的新式连接,因为它们需要信号可访问.
gre*_*eth 15
插槽是简单的方法,可以是公共的,受保护的或私有的.
正如安德烈指出的那样,信号只是对受保护的重新定义,这意味着它们只能由定义它们的类发出.
如果你想让一个类从anoter发出一个信号,你必须添加一个像这样的公共方法(或插槽):
void emitTheSignal(...) {
emit theSignal(...);
}
Run Code Online (Sandbox Code Playgroud)
Nik*_*nko 14
信号protected在Qt4中,在Qt5中它们是public.Int Qt5你可以private通过添加QPrivateSignal作为最后一个参数来创建它们.更多相关信息:http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html
现在你可以使用Q_SIGNAL宏和普通的 C++ 访问说明符:
protected:
Q_SIGNAL void myProtectedSignal();
private:
Q_SIGNAL void myPrivateSignal();
Run Code Online (Sandbox Code Playgroud)
在任何物体都可以连接到任何信号的意义上,Qt信号是公共的.