Nig*_*LxD 5 c++ qt qmetaobject
我有一个后台线程执行任务,完成后,UI 应该更新。要更新 UI,我需要 UI 线程来执行我的函数,其中包含更新 UI 的代码。
Qt 有QMetaObject::invokeMethod((QObject *context, Functor function, Qt::ConnectionType type = Qt::AutoConnection, FunctorReturnType *ret = nullptr)方法。根据文档,Qt 在创建的线程中调用函子或函数上下文指针,但也可以使用 lambda 来实现(如下所示)。
// QtApplicationWrapper::sApp is of type QGuiApplication
// pFunc - pointer to a function
// pFuncParms - argument of type void *
QMetaObject::invokeMethod (QtApplicationWrapper::sApp,
[=] {
pFunc (pFuncParms);
},
Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)
上面的代码有效。但假设我不想使用 lambda 或函子。
pFunc 可以直接传递给 QMetaObject::invokeMethod ,如下所示:
QMetaObject::invokeMethod (QtApplicationWrapper::sApp,
pFunc,
Qt::QueuedConnection);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何传递参数。上面的代码仅适用于不带参数的函数。
如何在 UI 线程中调用 pFunc 及其参数?
QMetaObject 有多个重载,如 中所述https://doc.qt.io/qt-6/qmetaobject.html
。
这些重载之一是bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, Args &&... args)
,它接受任意数量的参数,并且可以像这样调用:QMetaObject::invokeMethod(this, "performAction", Qt::BlockingQueuedConnection, Q_ARG(std::string&, result), Q_ARG(std::string, action), Q_ARG(std::string, signal), Q_ARG(std::string, param));
请注意,在传递指针或引用时,您必须使用阻塞连接或以其他方式确保您传递的信息在消息实际执行时仍然有效。
前两个参数是此重载最重要的信息。第一个告诉 Qt 在哪个类中查找第二个参数(是字符串,而不是函数指针)中指定的函数。
如果您想使用“正确的表示法”,我强烈建议使用 lambda 或std::bind
.
归档时间: |
|
查看次数: |
77 次 |
最近记录: |