【发布时间】:2011-01-09 17:37:21
【问题描述】:
Qt 信号可以是公共的还是私有的?我可以创建仅在类内部可见的内部信号吗?
更新:我有一个带有一些内部信号的课程。如何使这些信号对其他类不可见(封装和信息隐藏)?
【问题讨论】:
-
在这种情况下使用 PIMPL 模式。
标签: qt qt-signals
Qt 信号可以是公共的还是私有的?我可以创建仅在类内部可见的内部信号吗?
更新:我有一个带有一些内部信号的课程。如何使这些信号对其他类不可见(封装和信息隐藏)?
【问题讨论】:
标签: qt qt-signals
所有现有答案都不正确。
可以通过在其定义中添加QPrivateSignal 类型作为最后一个参数来将信号设为私有:
signals:
void mySignal(QPrivateSignal);
QPrivateSignal是Q_OBJECT宏在每个QObject子类中创建的私有结构,所以只能在当前类中创建QPrivateSignal对象。
从技术上讲,信号仍然具有公共可见性,但它只能由创建它的类发出。
【讨论】:
您可以为此使用 PIMPL 模式。您的私有信号仅存在于私有实现中。
【讨论】:
没有。信号不能是公共的或私有的。 Qt 信号是受保护的类方法。
“signals”关键字在 qobjectdefs.h 中定义(Qt 4.6.1 的第 69 行):
# define signals protected
更新: 信号仅是 protected 直到并包括 Qt 4 的所有次要版本。从 Qt 5.0 开始,它们是 public。见https://stackoverflow.com/a/19130831。
【讨论】:
public 在这里看到stackoverflow.com/questions/19129133/…
信号在 Qt4 中是 protected,在 Qt5 中它们是 public。 Int Qt5,您可以通过添加 QPrivateSignal 作为最后一个参数来使它们成为 private。更多信息:http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html
【讨论】:
QPrivateSignal
一种常见的方式,例如在 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)) 引入的新型连接,因为它们要求信号可访问。
【讨论】:
插槽是简单的方法,可以是公共的、受保护的或私有的。
正如 Andrei 所指出的,信号只是对受保护的重新定义,这意味着它们只能由定义它们的类发出。
如果你想让一个类从另一个类发出信号,你必须给它添加一个像这样的公共方法(或槽):
void emitTheSignal(...) {
emit theSignal(...);
}
【讨论】:
qobjectdefs.h : #define signals protected,所以不,信号不是public。
Qt 信号是公共的,因为任何对象都可以连接到任何信号。
【讨论】: