C++ 如何在QML函数也是异步的情况下从QML使用QThread

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[

我正在寻找在QML中使用
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官方文档):

<>因为在Qt和QML中有信号,你可以在C++中实现所有你想要的,然后把它放在QML。


你可以参考我为你准备的。实现了
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
                        }
                    }
 ....
}