是"公共插槽:"在Qt5中仍然需要哪些部分?

时间:2017-11-09 08:01:35

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

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

  • /* |-------------------------------------------------------------------------- | Application Timezone |-------------------------------------------------------------------------- | | Here you may specify the default timezone for your application, which | will be used by the PHP date and date-time functions. We have gone | ahead and set this to a sensible default for you out of the box. | */ 'timezone' => 'UCT', 派生类是否仍然有益于声明Q_OBJECT个部分?

注意:使用新语法,您可以将信号连接到类的任何公共函数,或直接实现C ++ 11 lambda(也可以调用某些成员函数)本身)。

Qt's new signal/slot syntax

4 个答案:

答案 0 :(得分:11)

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

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

以下是没有特定顺序的用例:

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

答案 1 :(得分:2)

  

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

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

然而,为了清楚起见,我仍然这样做,因为当其他人开始使用该课程时,它使得课程的目的更清晰。

例如:

class Foo : public QObject
{
   public: 
      Foo();

   public slots:
      void AddData();

   private:
      void CalculateStuff();
};

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

答案 2 :(得分:0)

如果你打算使用" old"那么moc内省仍需要

public slots:等声明。连接方式。使用新语法,这个声明没有任何意义,因为,正如您也注意到的那样," slots"由函数指针直接调用。 "插槽"甚至可能是一个非阶级成员。

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

答案 3 :(得分:0)

Qml仍然需要它们,因此您可以连接到C ++插槽。但是,如果要调用C ++ QObject成员函数,则可以将其声明为Q_INVOKABLE。你不需要把它变成一个插槽。虽然与使用slots:相比,使用Q_INVOKABLE可能更具可读性。由你决定。

如果您希望Designer能够看到它们,那么它们也是必需的。 Designer有一个“信号/插槽”编辑器,它不会列出slots:部分中没有的功能。但是,Designer仍然使用旧的基于字符串的语法来处理信号和插槽,因此我不建议使用其信号/插槽编辑器。