私人/公共qt信号

私人/公共qt信号,qt,qt-signals,Qt,Qt Signals,Qt信号是公共的还是私有的?我可以创建只在类内部看到的内部信号吗 更新:我有一个带有一些内部信号的类。如何使这些信号对其他类不可见(封装和信息隐藏)?Qt信号是公开的,因为任何对象都可以连接到任何信号 否。信号不能是公共或私人的。Qt信号是受保护的类方法 qobjectdefs.h中定义了“信号”关键字(Qt 4.6.1的第69行): 更新:信号仅受保护最高达并包括Qt 4的所有次要版本。从Qt 5.0开始,它们是公共的。请参阅。插槽是简单的方法,可以是公共的、受保护的或私有的 正如Andrei

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


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

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

否。信号不能是公共或私人的。Qt信号是受保护的类方法

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


更新:信号仅受
保护
最高达并包括Qt 4的所有次要版本。从Qt 5.0开始,它们是
公共的
。请参阅。

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


正如Andrei指出的,信号只是受保护的重新定义,这意味着它们只能由定义它们的类发出

如果要使一个类从另一个类发出信号,必须将其添加到公共方法(或插槽),如下所示:

void emitTheSignal(...) {
  emit theSignal(...);
}

一种常见的方式,例如在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();
这使得信号是私有的,即它只能由类本身发出,而不能由其子类发出。为了不让“私有”:否决Q_信号(moc不会将某些私有信号视为信号),它在Q_moc_运行中,只有在moc运行时才定义


编辑:这种方法不适用于Qt 5引入的新型连接(
connect(a,&a::someSignal,b,&b::someSlot)
),因为它们要求信号可以访问。

信号在Qt4中受
保护
,在Qt5中它们是
公共的
。Int Qt5通过添加
QPrivateSignal
作为最后一个参数,可以将它们设置为
private
。更多信息:

您可以使用PIMPL模式。您的专用信号仅存在于专用实现中。

所有现有答案都不正确

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

信号:
无效我的信号(QPrivateSignal);
QPrivateSignal
是由
Q_OBJECT
宏在每个
QObject
子类中创建的私有结构,因此您只能在当前类中创建
QPrivateSignal
对象


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

我认为这并不能回答OP的问题。他所指的信号只能由定义它们的类听到。“它们只能由定义它们的类发出”…或一个朋友类。;)我不确定这是真的。请参见此处:docs cay信号可以从其他类发出,并且始终是公共的,不受保护。从
qobjectdefs.h
#定义受保护的信号
,因此,不,信号不是
公共的
。不,因为“#定义受保护的Q#U信号”,私有:不会有任何效果。为什么C++中的每一项都需要黑客?“这种方法对于QT 5引入的新型连接不起作用”取决于…如果只想在内部连接信号(插槽可能会发出另一个,然后是公共信号),那么这是理想的——除了旧语法仍然允许连接到它之外……我相信信号现在被认为是
public
看这里似乎可以有私有信号:-它们是如何创建的?它们也是公共的,因为任何其他类都可能发出它们,因为它们是公共函数。这可能与以前版本的Qt有所不同。请看这里,面向对象编程使用封装来避免访问内部方法和数据。如果信号仅用于内部目的,它们也应该隐藏。从QObject派生的PIMPL不会使其更重并恶化性能吗?是的,它需要一些时间。但是考虑下面的问题:调用子程序需要花费多少时间?相关程序部分的性能是否相关?不确定为什么会被否决。我成功地使用了这种方法,例如一个状态机包装器,它在内部使用QStateMachine,但不公开它(架构原因)。同样,我不想公开用于使状态机进行转换的信号,否则这些信号将与公共API信号混合,这将降低可维护性。由于状态机仅在用户交互上转换,因此对性能的影响在我的情况下是完全不相关的。在这种情况下使用PIMPL模式。尼斯哈克:如果名称为
QPrivateSignal
Q_SIGNALS:
#ifndef Q_MOC_RUN
    private: // don't tell moc, doxygen or kdevelop, but those signals are in fact private
#endif

   void somePrivateSignal();