除了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
这是一个重载函数。
使用连接类型Qt::AutoConnection调用上下文事件循环中的函数。函数可以是函子,也可以是指向成员函数的指针。如果函数可以被调用,则返回true。如果没有这样的成员或参数不匹配,则返回false。函数调用的返回值放在ret中。
注意:这个函数是线程安全的。
这个函数是在Qt 5.10中引入的。