是";公众时段:;Qt5中仍然需要部分?

是";公众时段:;Qt5中仍然需要部分?,qt,c++11,qt5,signals-slots,Qt,C++11,Qt5,Signals Slots,关于Qt5中新的信号/插槽语法的一个简单问题: Q\u对象派生类声明了公共插槽:节,这还有什么好处吗 注意:使用新语法,您可以将信号连接到类的任何公共函数,或者直接实现C++11 lambda(它本身也可以调用一些成员函数) 公共插槽:等。如果要使用“旧”连接样式,moc自省仍然需要声明。对于新语法,这种声明没有任何意义,因为正如您注意到的,“插槽”是由函数指针直接调用的。“slot”甚至可以是非类成员函数 但是,您仍然需要在类声明的signals:部分下声明信号 您可以将信号连接到类的任何

关于Qt5中新的信号/插槽语法的一个简单问题:

  • Q\u对象
    派生类声明了
    公共插槽:
    节,这还有什么好处吗
注意:使用新语法,您可以将信号连接到类的任何公共函数,或者直接实现C++11 lambda(它本身也可以调用一些成员函数)


公共插槽:等。如果要使用“旧”连接样式,moc自省仍然需要声明。对于新语法,这种声明没有任何意义,因为正如您注意到的,“插槽”是由函数指针直接调用的。“slot”甚至可以是非类成员函数

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

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

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

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

例如:

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

   public slots:
      void AddData();

   private:
      void CalculateStuff();
};

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

它们仍然需要QML,这样你就可以连接到C++插槽。但是,如果您想调用C++ QObjor成员函数,可以将其声明为<代码> QyNojkabl < /C>。你不需要让它成为一个插槽。尽管使用
插槽:
可能比使用
Q\u INVOKABLE
更具可读性。由你决定


如果你想让设计师看到它们,也需要它们。Designer有一个“信号/插槽”编辑器,它不会列出不在
插槽:
部分中的函数。然而,Designer仍然对信号和插槽使用基于字符串的旧语法,因此我不建议使用它的信号/插槽编辑器。

虽然vahancho和DarkKnight的答案是有效的:
插槽对于连接来说不是必需的,但它使意图更清晰,并允许内省。我想我应该列出一些您确实需要
插槽的用例

首先请注意,您可以使用
插槽
,或者让元对象(内省)系统知道某个函数
Q_INVOKABLE
的优点是可以在构造函数上使用它

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

  • 使您的代码与Qt4一起工作。即使Qt4没有被维护,我想一些大公司仍然在使用它,使用Qt5和Qt4制作一个库是相当容易的
  • 使功能在QML(和Qt Quick)中可用
  • 使函数在javascript中可用(Qt脚本、Qt WebEngine等)
  • 使用
    QMetaObject::invokeMethod()
    使函数可调用。Qt5.10中提供了接受函子的重载
  • 利用。请注意,此函数可能会受到对象名称冲突的影响,但它仍然是Qt小部件设计器连接其创建的插槽的方式
  • 使您的类可以使用实例化
  • 以及所有其他需要运行时内省的用例

为什么不呢?这取决于您。插槽声明还可以在头文件中用作文档功能,用于突出显示信号/插槽连接中使用的函数。这就是为什么我一直使用它,即使使用新的Qt5样式语法。