为什么我不能调用QMetaObject :: invokeMethod(&threadObj,&QThread :: start,Qt :: QueuedConnection)?

问题描述 投票:0回答:2

我有一个控制台应用程序,其中一个QCoreApplicationmain()中运行事件循环。在这里,我有一个对象,它是QThread的派生对象,实现了run()来进行一些测试。我希望线程在启动我的应用程序时启动,所以我叫

QMetaObject::invokeMethod(&threadObj, &QThread::start, Qt::QueuedConnection);
return qapp.exec();

main()的末尾。

这是我的问题:为什么不编译?

QThread::quit相同,但QThread::exit无效。我认为这与startexit的参数有关?

编译器错误如下所示:

d:\dev\project\project\main.cpp(49): error C2665: 'QMetaObject::invokeMethod': none of the 4 overloads could convert all the argument types
1>x:\hmi_qt5\qt\msvc2017_x86\debug\include\qtcore\qobjectdefs.h(448): note: could be 'bool QMetaObject::invokeMethod(QObject *,const char *,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument)' (compiling source file main.cpp)
1>x:\hmi_qt5\qt\msvc2017_x86\debug\include\qtcore\qobjectdefs.h(431): note: or       'bool QMetaObject::invokeMethod(QObject *,const char *,Qt::ConnectionType,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument)' (compiling source file main.cpp)
1>x:\hmi_qt5\qt\msvc2017_x86\debug\include\qtcore\qobjectdefs.h(414): note: or       'bool QMetaObject::invokeMethod(QObject *,const char *,QGenericReturnArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument,QGenericArgument)' (compiling source file main.cpp)
1>d:\dev\project\project\main.cpp(49): note: while trying to match the argument list '(threadObj*, void (__thiscall QThread::* )(QThread::Priority), Qt::ConnectionType)'

预先感谢,

鲍勃

PS:通过使用仿函数或在threadObj中实现自定义插槽,我确实有解决方法。我问这个问题是因为我很好奇为什么它不起作用,因为我认为语法很好。

我有一个带有QCoreApplication的控制台应用程序,它在main()中运行事件循环。在这里,我有一个对象,它是QThread的派生对象,实现了run()来进行一些测试。我想要...

c++ qt qthread
2个回答
0
投票

所以看来我找到了答案。正如我最初预期的那样,问题不在于Qt内,而是C ++内。使用函数指针进行间接函数调用时,只能调用参数列表为空的函数。 (例如QThread::quit(void))当调用具有参数列表(包括默认参数)的函数时,它将使用显式参数隐式调用该函数。这在这里不起作用,因为在functoin指针中不能有参数。


0
投票

问题是QThread::start的参数存在,尽管默认设置,并且在将QMetaObject::invokeMethod的最重要重载定义为const char *member作为第二个参数的方面,Qt无效。因此,使用这些重载之一可以直接使用它:

© www.soinside.com 2019 - 2024. All rights reserved.