关于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(也可以调用某些成员函数)本身)。
答案 0 :(得分:11)
虽然vahancho和TheDarkKnight的答案是有效的:连接不需要slots
,但它使意图更清晰并允许内省。我想我应该列出一些你需要slots
的用例。
首先请注意,您可以使用slots
,Q_SLOTS
,Q_SLOT
或Q_INVOKABLE
来创建元对象(内省)系统已知的函数。 Q_INVOKABLE
具有可以在构造函数上使用的优点。
以下是没有特定顺序的用例:
QMetaObject::invokeMethod()
使函数可调用。 接受仿函数的重载将在Qt 5.10中提供。 QMetaObject::connectSlotsByName()
。请注意,此函数should not be used可能会受到对象名称冲突的影响,但它仍然是Qt小部件设计器连接其创建的插槽的方式。QMetaObject::newInstance()
使您的类可实例化。答案 1 :(得分:2)
您可以将信号连接到类的任何公共函数或直接实现C ++ 11 lambda
虽然这在Qt 5中提供,它允许对插槽进行编译时验证,而不是使用SIGNAL
和SLOT
宏时,不再需要声明一个函数作为连接它的插槽。
然而,为了清楚起见,我仍然这样做,因为当其他人开始使用该课程时,它使得课程的目的更清晰。
例如:
class Foo : public QObject
{
public:
Foo();
public slots:
void AddData();
private:
void CalculateStuff();
};
通过查看类,我们可以假设函数AddData
旨在通过信号调用;也许它在一个单独的线程上执行。
答案 2 :(得分:0)
public slots:
等声明。连接方式。使用新语法,这个声明没有任何意义,因为,正如您也注意到的那样," slots"由函数指针直接调用。 "插槽"甚至可能是一个非阶级成员。
但是,您仍然需要在班级声明的signals:
部分声明您的信号。
答案 3 :(得分:0)
Qml仍然需要它们,因此您可以连接到C ++插槽。但是,如果要调用C ++ QObject成员函数,则可以将其声明为Q_INVOKABLE
。你不需要把它变成一个插槽。虽然与使用slots:
相比,使用Q_INVOKABLE
可能更具可读性。由你决定。
如果您希望Designer能够看到它们,那么它们也是必需的。 Designer有一个“信号/插槽”编辑器,它不会列出slots:
部分中没有的功能。但是,Designer仍然使用旧的基于字符串的语法来处理信号和插槽,因此我不建议使用其信号/插槽编辑器。