【问题标题】:Does it make any difference, using public slots instead of private slots in Qt?在 Qt 中使用公共插槽而不是私有插槽有什么不同吗?
【发布时间】:2013-06-05 08:56:59
【问题描述】:

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

但在 Qt 中,private slotspublic slots 的区别似乎不存在。最近开始写Qt,一直用private slots

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

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

【问题讨论】:

标签: c++ qt signals-slots


【解决方案1】:

来自Qt Documentation

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 小附录:对于真正的私有插槽,还可以使用(未​​记录的,内部的)Q_PRIVATE_SLOT 机制,它允许在另一个(通常是私有的)类中定义插槽。
    【解决方案3】:

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

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

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

    结论:

    • 如果您有阻塞槽,请将它们设为private
    • 如果将槽用作对象属性的简单设置,请将它们设为public
    • 如果您需要一些带有返回值或不固定引用参数的方法,甚至不要将它们设置为槽(这是废话),只需 public 就足够了。

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 2010-11-26
      • 1970-01-01
      • 2012-05-10
      相关资源
      最近更新 更多