【问题标题】:Are "public slots:" sections still necessary in Qt5?Qt5 中是否仍然需要“公共插槽:”部分?
【发布时间】:2018-04-22 03:29:21
【问题描述】:

关于 Qt5 中新的 signal/slot 语法的一个简单问题:

  • Q_OBJECT 派生类声明 public slots:sections 是否还有好处?

注意:使用新语法,您可以将信号连接到类的 any 公用函数或直接实现 C++11 lambda(也可以自己调用一些成员函数) .

Qt's new signal/slot syntax

【问题讨论】:

  • 为什么不呢?这取决于你。

标签: qt c++11 qt5 signals-slots


【解决方案1】:

虽然 vahancho 和 TheDarkKnight 的答案是有效的:slots 不是连接所必需的,但它使意图更清晰并允许自省。我想我应该列出一些你确实需要slots 的用例。

首先请注意,您可以使用slotsQ_SLOTSQ_SLOTQ_INVOKABLE 使元对象(内省)系统知道函数。 Q_INVOKABLE 的优点是可以用在构造函数上。

以下是用例,不分先后:

  • 让您的代码与 Qt 4 一起工作。即使没有维护 Qt 4,我认为一些大公司仍在使用它,并且使库与 Qt 5 和 Qt 4 一起工作相当容易。
  • 使该函数在 QML(和 Qt Quick)中可用
  • 使函数在 javascript 中可用(Qt Script、Qt WebEngine 等)
  • 使函数可使用QMetaObject::invokeMethod() 调用。 接受函子的重载将在 Qt 5.10 中可用。
  • 使用QMetaObject::connectSlotsByName()。请注意,此函数should not be used 可能会受到对象名称冲突的影响,但它仍然是 Qt 小部件设计器连接它创建的插槽的方式。
  • 使用QMetaObject::newInstance() 使您的类可实例化。
  • 以及所有其他需要运行时自省的用例

【讨论】:

    【解决方案2】:

    Qml 仍然需要它们,以便您可以连接到 C++ 插槽。但是,如果要调用 C++ QObject 成员函数,只需将其声明为 Q_INVOKABLE。您无需将其设为插槽。尽管与使用 Q_INVOKABLE 相比,使用 slots: 可能更具可读性。由你决定。

    如果您希望设计师看到它们,它们也是必需的。 Designer 有一个“信号/槽”编辑器,它不会列出不在slots: 部分中的函数。但是,Designer 仍然对信号和槽使用旧的基于字符串的语法,所以我不建议使用它的信号/槽编辑器。

    【讨论】:

      【解决方案3】:

      您可以将信号连接到类的任何公共函数或直接实现 C++11 lambda

      虽然这在 Qt 5 中可用,它允许对插槽进行编译时验证,而不是使用 SIGNALSLOT 宏时,不再需要将函数声明为插槽连接到它。

      但是,为了清楚起见,我仍然这样做,因为当其他人开始使用该类时,它使该类的使用意图更加清晰。

      例如:

      class Foo : public QObject
      {
         public: 
            Foo();
      
         public slots:
            void AddData();
      
         private:
            void CalculateStuff();
      };
      

      仅通过查看类,我们可以假设函数AddData 被设计为通过信号调用;也许它在单独的线程上执行。

      【讨论】:

        【解决方案4】:

        public slots: 等声明仍然需要 moc 内省,如果您要使用“旧”连接样式。使用新语法,这个声明没有任何意义,因为,正如您还注意到的,“槽”直接由函数指针调用。 “Slots”甚至可能是一个非类成员函数。

        但是,您仍然需要在类声明的signals: 部分声明您的信号。

        【讨论】:

        • 插槽声明也可以用作头文件中的文档功能,以突出显示信号/插槽连接中使用的功能。这就是我继续使用它的原因,即使使用新的 Qt5 样式语法。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-27
        • 1970-01-01
        相关资源
        最近更新 更多