在Qt中使用公共插槽而不是私有插槽会有什么不同吗?

罗泽轩*_*罗泽轩 26 c++ qt signals-slots

在C++中,public意味着可以从对象可见的任何位置访问的成员,private意味着成员只能从同一类的其他成员或其朋友中访问.

但在Qt中,差异private slots并且public slots似乎并不存在.我最近几天开始写Qt,而且我private slots一直都在使用.

有人告诉我应该用public slots.所以现在我很困惑.我在Qt的文档中找不到参考信息.

两种类型之间的实际差异是什么?

小智 31

来自Qt文档:

由于插槽是普通的成员函数,因此它们在直接调用时遵循正常的C++规则.但是,作为插槽,它们可以通过信号插槽连接由任何组件调用,而不管其访问级别如何.这意味着从任意类的实例发出的信号可以导致在不相关的类的实例中调用私有槽.

这意味着:从另一个类中,您不能将私有插槽称为函数,但如果您发出连接到该私有插槽的信号,则可以调用它.


Zla*_*mir 14

编译器在编译时"检查"私有/公共访问,但信号槽连接在运行时执行,并且某些QMetaObject机制(例如invokeMethod)调用槽.

所以区别在于:私有槽私有的,如果称为常规成员函数,但总是" 公共 "用于调用信号,一个很好的理由是因为槽在概念上是公共接口,因为它们的主要目的是对象间通信

关于一些相关"怪异"东西的另一个例子是私有虚函数的调用,如果它们在用于调用方法的指针的静态类型中是公共的.

  • 小附录:对于真正的私有插槽,也可以使用(未​​记录的,内部的)Q_PRIVATE_SLOT`机制,该机制允许在另一个 - 通常是私有 - 类中定义插槽. (7认同)

AMC*_*ded 5

@ user2448027答案是正确的,但在Qt的设计模式缺少一点:不同的应用程序private slotsVS public slots.

通过创建插槽,private您可以强制对象的用户使用connect函数来调用插槽,而不是成员访问操作符(.->).

想象一下,你班级的其中一个插槽中有一个缓慢或阻塞的代码.您希望类的用户将创建的对象移动到另一个线程,因此该对象的所有者(GUI或某些与GUI相关的对象)不会通过调用此插槽来冻结或阻止.重点是:如果插槽由.->运算符直接调用,它将阻塞.因为调用方法的当前线程使用插槽,所以只有在使用公共插槽时才会发生.解决方案是创建插槽private,因此用户只能使用connect成员访问操作符(.->)来调用它.

结论:

  • 如果你有阻塞插槽,请制作它们private.
  • 如果使用插槽作为对象属性的简单设置,请创建它们public.
  • 如果你需要一些带有返回值或不稳定引用参数的方法,甚至不要让它们成为插槽(这是无意义的),只是public足够了.