QMetaObject::invokeMethod可选的编译时检查



除了QMetaObject::invokeMethod之外,是否有任何类型安全的方法可以异步调用方法/插槽(即在GUI线程中排队执行)?

QMetaObject::invokeMethod没有对函数名进行编译时检查。用字符串指定成员函数也有开销,因为每次调用都要执行查找和字符串匹配。

我想知道是否有类似于新的QObject::connect语法调用提供编译时检查的方法。

一种解决方案是使用信号槽架构,但这强制将每个调用者代码包装在QObject类中,以便能够发出该信号。

可以使用QTimer::singleShot来达到这个目的

QTimer::singleShot(0, object, &Object::method...);
--
QTimer::singleShot(0, object, [object](){
  object->method(arg1, arg2, ...);
});

注意:调用QTimer::singleShot的线程必须有一个QEventLoop

请参阅此https://doc.qt.io/qt-5/qmetaobject.html#invokeMethod-4

template bool QMetaObject::invokeMethod(QObject *context, Functor function, FunctorReturnType *ret)

这是一个重载函数。

使用连接类型Qt::AutoConnection调用上下文事件循环中的函数。函数可以是函子,也可以是指向成员函数的指针。如果函数可以被调用,则返回true。如果没有这样的成员或参数不匹配,则返回false。函数调用的返回值放在ret中。

注意:这个函数是线程安全的。

这个函数是在Qt 5.10中引入的。

最新更新