C++和QML混合编程_C++端后台多线程处理

C++和QML混合编程_C++端后台多线程处理

前言:继承 QThread然后重写 run()函数的方式实现,C++在后端处理耗时操作,QML在前端负责显示

方法一
①使用qmlRegisterType(“myobj”, 1, 0, “Myobject”);注册
②使用Connections或者是connect****在 QML端进行绑定C++端的信号和QML端的函数

Myobject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QThread>
#include "qdebug.h"

class Myobject : public QThread
{
    Q_OBJECT
public:
    explicit Myobject(QObject *parent = nullptr);
    void run() override;

signals:
    /* 声明一个信号,译结果准确好的信号 */
    void resultReady(QVariant s);

};

#endif // MYOBJECT_H

Myobject.cpp

#include "Myobject.h"

Myobject::Myobject(QObject *parent) : QThread(parent)
{

}

void Myobject::run()
{
    qDebug() << "fun";
    QString result = "线程开启成功";
    /* 发送结果准备好的信号 */
    emit resultReady(result);
    while (1) {
        emit resultReady("正在运行中......");
        sleep(1);
    }
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "Myobject.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
    qmlRegisterType<Myobject>("myobj", 1, 0, "Myobject");
    /*********************创建一个全局的单例模式******************/
//    Myobject *myobj = new Myobject();
//    qmlRegisterSingletonInstance("myobj", 1, 0, "Myobject", myobj);
    /*********************创建一个全局的单例模式******************/

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
    &app, [url](QObject * obj, const QUrl & objUrl) {
        if (!obj && url == objUrl) {
            QCoreApplication::exit(-1);
        }
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.0
import myobj 1.0

Window {
    objectName: "window"
    id:window
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    function handleResults(s)
    {
        console.log("qml",s)
    }

/*********使用qmlRegisterType注册时,必须用实例化出的对象来访问********/
    Myobject{
        id:myobj
    }
/*********使用qmlRegisterType注册时,必须用实例化出的对象来访问********/

/************************绑定信号和函数方式一**********************************/
//    Connections{
//        target:myobj
//        function onResultReady(s){  //注意要加上on和信号首字母大写
//            handleResults(s)
//        }
//    }
/************************绑定信号和函数方式一**********************************/

/************************绑定信号和函数方式二**********************************/
    Component.onCompleted: {
        myobj.resultReady.connect(handleResults)
    }
/************************绑定信号和函数方式二**********************************/
    Row{
        anchors.centerIn: parent
        spacing: 20

        Button{
            text: "点击"
            onClicked: {
                myobj.start()
            }
        }

    }
}

方法二
①使用qmlRegisterSingletonInstance(“myobj”, 1, 0, “Myobject”, myobj);单例
②使用Connections或者是connect在 QML端进行绑定C++端的信号和QML端的函数
③使用QObject::connect(myobj, SIGNAL(resultReady(QVariant)), window,SLOT(handleResults(QVariant)));在C++端进行绑定

Myobject.h

#ifndef MYOBJECT_H
#define MYOBJECT_H

#include <QThread>
#include "qdebug.h"

class Myobject : public QThread
{
    Q_OBJECT
public:
    explicit Myobject(QObject *parent = nullptr);
    void run() override;

signals:
    /* 声明一个信号,译结果准确好的信号 */
    void resultReady(QVariant s);

};

#endif // MYOBJECT_H

Myobject.cpp

#include "Myobject.h"

Myobject::Myobject(QObject *parent) : QThread(parent)
{

}

void Myobject::run()
{
    qDebug() << "fun";
    QString result = "线程开启成功";
    /* 发送结果准备好的信号 */
    emit resultReady(result);
    while (1) {
        emit resultReady("正在运行中......");
        sleep(1);
    }
}

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "Myobject.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
//    qmlRegisterType<Myobject>("myobj", 1, 0, "Myobject");
    /*********************创建一个全局的单例模式******************/
    Myobject *myobj = new Myobject();
    qmlRegisterSingletonInstance("myobj", 1, 0, "Myobject", myobj);
    /*********************创建一个全局的单例模式******************/

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
    &app, [url](QObject * obj, const QUrl & objUrl) {
        if (!obj && url == objUrl) {
            QCoreApplication::exit(-1);
        }
    }, Qt::QueuedConnection);
    engine.load(url);
    
/********************在C++端绑定时候使用********************/
//    auto list = engine.rootObjects();
//    auto window = list.first();
//    qDebug() << window->objectName();

//    QObject::connect(myobj, SIGNAL(resultReady(QVariant)), window,
//                     SLOT(handleResults(QVariant)));
/********************在C++端绑定时候使用********************/

    return app.exec();
}

main.qml

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.0
import myobj 1.0

Window {
    objectName: "window"
    id:window
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    function handleResults(s)
    {
        console.log("qml",s)
    }

/************************绑定信号和函数方式一**********************************/
//    Connections{
//        target:Myobject
//        function onResultReady(s){  //注意要加上on和信号首字母大写
//            handleResults(s)
//        }
//    }
/************************绑定信号和函数方式一**********************************/

/************************绑定信号和函数方式二**********************************/
    Component.onCompleted: {
        Myobject.resultReady.connect(handleResults)
    }
/************************绑定信号和函数方式二**********************************/
    Row{
        anchors.centerIn: parent
        spacing: 20

        Button{
            text: "点击"
            onClicked: {
                Myobject.start()
            }
        }

    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值