29

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

但在 Qt 中,两者的区别private slots似乎public slots并不存在。最近几天开始写Qt,一直在用private slots

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

这两种类型之间的实际区别是什么?

4

3 回答 3

36

来自Qt 文档

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

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

于 2013-06-09T18:19:51.127 回答
16

编译器在编译时“检查”私有/公共访问,但信号槽连接是在运行时执行的,并且槽由一些 QMetaObject 机制调用(例如invokeMethod)。

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

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

于 2013-06-09T16:02:55.007 回答
5

@user2448027 答案是正确的,但是 Qt 的设计模式中存在一个缺失点:vs的不同应用private slotspublic slots

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

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

结论:

  • 如果您有阻塞插槽,请将它们设置为private.
  • 如果插槽用作对象属性的简单设置,请将它们设置为public.
  • 如果您需要一些具有返回值或不固定引用参数的方法,甚至不要将它们设置为插槽(这是无稽之谈),仅此而已public
于 2016-08-04T21:05:09.703 回答