私人/公共qt信号

时间:2010-01-26 22:32:02

标签: qt qt-signals

Qt信号可以公开还是私有?我可以创建只在课堂内看到的内部信号吗?

更新:我有一个带有一些内部信号的课程。如何让这些信号对其他类不可见(封装和信息隐藏)?

7 个答案:

答案 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个对象。

从技术上讲,该信号仍然具有公众可见性,但是只能由创建它的类发出。