Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QMetaObject::具有编译时检查的invokeMethod替代方案_Qt_Signals Slots_Compile Time_Type Safety_Qtcore - Fatal编程技术网

Qt QMetaObject::具有编译时检查的invokeMethod替代方案

Qt QMetaObject::具有编译时检查的invokeMethod替代方案,qt,signals-slots,compile-time,type-safety,qtcore,Qt,Signals Slots,Compile Time,Type Safety,Qtcore,除了QMetaObject::invokeMethod之外,是否有任何类型安全的方式异步调用方法/插槽(即在GUI线程中排队执行) QMetaObject::invokeMethod没有编译时检查函数名。由于每次调用都会执行查找和字符串匹配,因此通过字符串指定成员函数也会带来开销 我想知道是否有类似于新的QObject::connect语法的东西用于调用提供编译时检查的方法 一种解决方案是使用信号插槽体系结构,但这强制将每个调用方代码包装在QObject类中,以便能够发出该信号。可以使用QTim

除了
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

请参见此

模板bool QMetaObject::invokeMethod(QObject*context,Functor函数,FunctorReturnType*ret)

这是一个重载函数

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

注意:此函数是线程安全的


这个函数是在Qt5.10中引入的。

我认为基本上是这样。@peppe:看来没有其他选择了:看一看。因此,您可以这样做,而不是
QMetaObject::invokeMethod(object,“method”)
{QObject src;QObject::connect(&src,&QObject::destromed,object,&object::method);}
您甚至可以通过这种方式将lamba函数与上下文
QObject
一起使用@迈克:好把戏!虽然这提供了编译时检查,但我想知道与字符串查找相比,它的开销有多大。您的代码段是一个不支持传递参数的示例,但是您的链接(
posttohread
template函数)中提出的解决方案也支持传递参数,对吗?是的。我在Mike提供的链接中看到了这个解决方案。与其他方法相比,您对该解决方案的开销有何评论?