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