2016-08-14 99 views
3

除了QMetaObject::invokeMethod是否有任何异步调用方法/槽的类型安全的方法(又名排队其在GUI线程中的执行)?QMetaObject :: invokeMethod替代与编译时检查

QMetaObject::invokeMethod没有编译时检查函数名称。由于每次调用都会执行查找和字符串匹配,因此通过字符串指定成员函数也会产生开销。

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

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

+0

它基本上是https://bugreports.qt.io/browse/QTBUG-36861,我想。 – peppe

+0

@peppe:看来没有其他选择了:https://bugreports.qt.io/browse/QTBUG-55304 – Isaac

+0

看看[this](https://stackoverflow.com/a/21653558/2666212)。因此,你可以这样做,而不是'QMetaObject :: invokeMethod(object,“method”)'':{QObject src; QObject :: connect(&src,&QObject :: destroyed,object,&Object :: method);}'你甚至可以使用带有'QObject'上下文的lamba函数。 。 。 – Mike

回答

0

有可能使用QTimer :: singleShot用于此目的

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

注:其中QTimer::singleShot调用必须有一个QEventLoop线程。

+0

是的。我在Mike提供的链接中看到了这个解决方案。与其他方法相比,您是否对此解决方案的开销有任何评论? – Isaac