插槽(在slots
部分中声明的方法)和Qt中的方法(使用Q_INVOKABLE关键字声明的方法)之间有什么区别?它们都可以使用QMetaObject::invokeMethod
调用,使用SLOT
宏连接到插槽时都会被接受,但是在获取元方法类型时,可以返回QMetaMethod::Method
或{{1}那么Qt似乎有些不同?
答案 0 :(得分: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"
由用户决定如何解释插槽和invokable之间的区别。例如。如果您以某种方式将插槽列表公开给用户,除非您选择这样做,否则您不会公开可调用方法列表。
答案 1 :(得分:0)
我所知道的实际差异:
Q_INVOKABLE
可以有返回值,slot
不能。Q_INVOKABLE
在 GUI 线程上被调用,并阻塞 GUI 线程。 slot
的线程取决于创建 QObject
的线程,因此可以是非阻塞的。所以我的经验法则是,如果没有返回值,则使用 slot
,否则使用 Q_INVOKABLE
。