Qt中的插槽和方法有什么区别?

时间:2016-08-29 12:48:10

标签: c++ qt

插槽(在slots部分中声明的方法)和Qt中的方法(使用Q_INVOKABLE关键字声明的方法)之间有什么区别?它们都可以使用QMetaObject::invokeMethod调用,使用SLOT宏连接到插槽时都会被接受,但是在获取元方法类型时,可以返回QMetaMethod::Method或{{1}那么Qt似乎有些不同?

2 个答案:

答案 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