44

Qt 信号可以是公共的还是私有的?我可以创建仅在课堂内可见的内部信号吗?

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

4

7 回答 7

26

不可以。信号不能是公开的或私人的。Qt 信号是受保护的类方法。

“signals”关键字在 qobjectdefs.h 中定义(Qt 4.6.1 的第 69 行):

#   define signals protected

更新:信号仅protected包括 Qt 4 的所有次要版本。从 Qt 5.0 开始,它们是public. 请参阅https://stackoverflow.com/a/19130831

于 2010-01-27T11:44:02.020 回答
19

一种常见的方式,例如在 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)) 引入的新型连接,因为它们需要信号可访问。

于 2011-04-07T21:53:17.130 回答
17

信号protected在 Qt4 中,在 Qt5 中是public. Int Qt5,您可以private通过添加QPrivateSignal作为最后一个参数来制作它们。更多信息:http ://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html

于 2015-09-29T15:40:07.420 回答
14

插槽是简单的方法,可以是公共的、受保护的或私有的。

正如安德烈指出的那样,信号只是对受保护的重新定义,这意味着它们只能由定义它们的类发出。

如果你想让一个类从另一个类发出信号,你必须给它添加一个像这样的公共方法(或槽):

void emitTheSignal(...) {
  emit theSignal(...);
}
于 2010-03-05T09:16:44.003 回答
4

Qt 信号是公共的,因为任何对象都可以连接到任何信号。

于 2010-01-26T22:33:51.577 回答
2

所有现有的答案都不正确。

QPrivateSignal可以通过将类型添加到其定义中作为最后一个参数来使信号成为私有:

signals:
  
  void mySignal(QPrivateSignal);

QPrivateSignal是宏在每个QObject子类中创建的私有结构体Q_OBJECT,所以只能QPrivateSignal在当前类中创建对象。

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

于 2020-10-13T22:51:08.957 回答
0

您可以为此使用 PIMPL 模式。您的私有信号仅存在于私有实现中。

于 2019-07-10T12:51:36.353 回答