【发布时间】:2020-04-05 20:35:08
【问题描述】:
我有一个带有QCoreApplication 的控制台应用程序,在main() 中运行事件循环。
这里我有一个对象,它是 QThread 的派生对象,实现了 run() 以进行一些测试。
我希望线程在启动我的应用程序时启动,所以我调用了
QMetaObject::invokeMethod(&threadObj, &QThread::start, Qt::QueuedConnection);
return qapp.exec();
在main()的末尾。
这是我的问题:为什么不能编译?
对QThread::quit 执行相同操作可以正常工作,但QThread::exit 不行。
我认为这与start 和exit 的参数有关?`
编译器错误看起来像这样:
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 中实现自定义插槽。
我问这个是因为我很好奇为什么这不起作用,因为我认为语法很好。
【问题讨论】:
-
Qt 版本? C++ 标准版本?
-
@Superlokkus 我使用 Qt 5.12 和 C++11