gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:07:47 26 4
gpt4 key购买 nike

我有一个控制台应用程序,其中的 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 中实现自定义槽。我问这个是因为我很好奇为什么这不起作用,因为我认为语法很好。

最佳答案

问题在于QThread::start参数的存在,尽管是默认的,并且Qt在QMetaObject::invokeMethod最重要的重载方面被破坏了> 使用 const char *member 作为第二个参数进行定义。因此,使用这些重载之一,您可以直接使用它:

#include <functional>

#include <QtWidgets/QApplication>
#include <QtWidgets/QtWidgets>
#include <QtWidgets/QMainWindow>

#include <QThread>

int main(int argc, char *argv[]) {
QThread threadObj;
QMetaObject::invokeMethod(&threadObj, "start", Qt::QueuedConnection);

QApplication this_application(argc, argv);
return this_application.exec();
}

另一种解决方案是

QMetaObject::invokeMethod(&threadObj, std::bind(&QThread::start,std::ref(threadObj),QThread::InheritPriority), Qt::QueuedConnection);

这与 lambda 几乎相同,但恕我直言,意图更清晰。

关于c++ - 为什么我不能调用 QMetaObject::invokeMethod(&threadObj, &QThread::start, Qt::QueuedConnection)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59304804/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com