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

时间:2013-06-09 15:56:47

标签: c++ qt signals-slots

在C ++中,public表示可以从对象可见的任何位置访问的成员,private表示只能从同一类的其他成员或其朋友中访问成员。 / p>

但在Qt中,private slotspublic slots的差异似乎不存在。我最近几天开始编写Qt,我一直使用private slots

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

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

3 个答案:

答案 0 :(得分:31)

来自Qt Documentation

  

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

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

答案 1 :(得分:14)

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

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

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

答案 2 :(得分:5)

@ user2448027答案是正确的,但Qt的设计模式中缺少一点:private slots vs {{1}的 不同的应用程序 }}。

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

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

<强> 结论:

  • 如果您有阻止广告位,请将其设为->
  • 如果将插槽用作对象属性的简单设置,请将它们设为private
  • 如果你需要一些带有返回值或不稳定引用参数的方法,甚至不要让它们成为插槽(这是无意义的),只有public就足够了。
相关问题