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()
}
}
}
}