C++ 如何在QML函数也是异步的情况下从QML使用QThread
我正在寻找在QML中使用C++ 如何在QML函数也是异步的情况下从QML使用QThread,c++,multithreading,qt,qml,qthread,C++,Multithreading,Qt,Qml,Qthread,我正在寻找在QML中使用QThread的方法。 我想将参数传递给QThread函数并从中返回bool值 我想从QML方面了解的另一件事是,当应用程序执行在调用/执行QThread之前发生的脚本时,不要阻止它 下面是一个示例代码: main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include "testasync.h" int main(int argc, char *argv[
QThread
的方法。
我想将参数传递给QThread
函数并从中返回bool值
我想从QML方面了解的另一件事是,当应用程序执行在调用/执行QThread
之前发生的脚本时,不要阻止它
下面是一个示例代码:
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "testasync.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
qmlRegisterType<testAsync>("testAsync",1,0,"thread");//not working on main.qml
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
#include "testAsync.h"
#include <QDebug>
#include <QtCore>
testAsync::testAsync(){}
void testAsync::run() {
for(int i = 0; i <= 100; i++)
{
qDebug() << this->name << " " << i;
}
//return true
}
testasync.h
#ifndef TESTASYNC_H
#define TESTASYNC_H
#include <QThread>
#include <QObject>
class testAsync : public QThread
{
Q_OBJECT
public:
testAsync();
void run();
private:
QString name;
};
#endif // TESTASYNC_H
如何做到这一点?正确注册类型:
qmlRegisterType<testAsync>("TestAsync", 1, 0, "TestAsync");
您已经犯了几个错误,这些错误使您偏离了预期目标
正如@ FulbIS和@ Hubi所提到的,您使用了从小写字母开始的C++类名。QML对此有问题
关于多线程,有很多方法可以做到这一点。这取决于你的具体任务 我确实建议您阅读下一篇文章(来自Qt官方文档):
你可以参考我为你准备的。实现了
moveToThread
方法 我不确定,但是这种类型的第一个字母不应该是大写字母吗?看来这篇文章也有同样的问题,检查一下。@folibis我是根据这篇文章写的。您所指的字母是什么?项目类型应该是Thread
,而不是Thread
。在QML中,项目类型名称不能以小字符开头。除此之外,Thread
可能是一个保留字。谢谢@Hubi,这几乎是我所有的疑问。线程函数是否有返回值的方法?在qml/javascript方面,我想我需要使用Workerscript,我会检查您的项目,谢谢。我想要的是,当我单击按钮时,没有任何内容被阻止,并且Qthread函数从中返回一个值。@Nmaster88只引用共享项目。1)UI中没有被阻止的内容,所以您可以看到进度条正在运行等2)在单独的线程中执行3)在单独的线程中执行完成后,UI会收到通知4)UI中填充了从线程返回的值。您的示例看起来棒极了,我只是有另一个没有解决的问题。我需要在qml端做一些处理,这需要一些时间,我不希望它阻塞UI线程。我将把这标记为接受的答案,因为这解决了我想要的大部分问题,我已经为qml线程处理部分打开了另一篇文章。
qmlRegisterType<testAsync>("TestAsync", 1, 0, "TestAsync");
import QtQuick 2.0
import QtQuick.Controls 1.4
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.3
import TestAsync 1.0
ApplicationWindow {
id: window
title: "Stack"
visible: true
width: 1400
TestAsync {
id: threadAsync
}
Page {
....
Button {
property bool test : true
text: "async"
onClicked: {
if(test) {
val=threadAsync.start()
} else {
val=threadAsync.quit()
}
console.log(val)
test=!test
}
}
....
}