私人/公共qt信号

ant*_*ton 34 qt qt-signals

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

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

小智 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/.

  • 我相信信号现在被视为"公共".请参见http://stackoverflow.com/questions/19129133/qt-signals-and-slots-permissions/19130567#19130567 (3认同)

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)

  • 我认为这不符合OP问题.他指的是只有被定义它们的类才能听到的信号. (6认同)

Nik*_*nko 14

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


doc*_*doc 8

现在你可以使用Q_SIGNAL宏和普通的 C++ 访问说明符:

protected:
  Q_SIGNAL void myProtectedSignal();

private:
  Q_SIGNAL void myPrivateSignal();
Run Code Online (Sandbox Code Playgroud)


Kyl*_*utz 5

在任何物体都可以连接到任何信号的意义上,Qt信号是公共的.

  • 在任何其他类都可以发出它们的意义上,它们也是公共的,因为它们是公共函数。这可能与之前版本的 Qt 有所不同。见这里 http://stackoverflow.com/questions/19129133/qt-signals-and-slots-permissions/19130567#19130567 (2认同)