插槽(在slots节中声明的方法)和Qt中的方法(使用Q_INVOKABLE关键字声明的方法)之间有什么区别?它们都可以使用调用QMetaObject::invokeMethod,当使用SLOT宏连接到插槽时它们都被接受,但是当获得metamethod的类型时,它可以返回QMetaMethod::Method或者QMetaMethod::Slot,所以看起来Qt有一些区别?
Rei*_*ica 11
唯一的区别是该方法是在类的元数据中列为插槽还是非插槽.在Qt 4和Qt 5中,与插槽或可调用的连接都成功:
#include <QObject>
struct Test : public QObject {
Q_SLOT void slot() {}
Q_INVOKABLE void invokable() {}
Q_OBJECT
};
int main() {
Test test;
auto c1 = QObject::connect(&test, SIGNAL(destroyed(QObject*)), &test, SLOT(slot()));
auto c2 = QObject::connect(&test, SIGNAL(destroyed(QObject*)), &test, SLOT(invokable()));
Q_ASSERT(c1);
Q_ASSERT(c2);
}
#include "main.moc"
Run Code Online (Sandbox Code Playgroud)
由用户决定如何解释插槽和可调用插件之间的差异.例如,如果您以某种方式向用户公开插槽列表,则除非您选择这样做,否则不会公开可调用方法列表.
我所知道的实际差异:
Q_INVOKABLE可以有返回值,但slot不能向GUI线程返回值。Q_INVOKABLE在 GUI 线程上调用并阻塞 GUI 线程。slot的线程取决于QObject创建的线程,因此可以是非阻塞的。所以我的经验法则是,slot如果没有返回值,则使用 ,否则使用Q_INVOKABLE.