QML 调用C++ 单列对象

QML 调用C++ 单列对象

一些对象是全局唯一的,特别适合使用单列模式,比如网络,数据库,或者跟设备相关的功能,如串口,plc等,因此在QML中访问C++的单列,就很有必要。

一,C++单例

以一个相机操作为例,这里只列出只要功能。

class ImageHandle : public QThread
{
Q_OBJECT

public:
//单例模式的声明
static ImageHandle* instance(){
static ImageHandle manager;
return &manager;
}

//给QML调用的接口
Q_INVOKABLE void startPreview();

private:
explicit ImageHandle(QObject *parent = nullptr);
~ImageHandle();

};

二,main.cpp 中注册单列,这样才能在QML中使用。

一共两步,一步定义一个函数(configureProvider),还有一步是利用qmlRegisterSingletonType注册

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QIcon>
#include "comm/imageHandle.h"

//单例的使用
static QObject *configureProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
Q_UNUSED(engine)
Q_UNUSED(scriptEngine)
return ImageHandle::instance();
}

int main(int argc, char *argv[])
{
QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
QGuiApplication::setAttribute(Qt::AA_Use96Dpi);

QGuiApplication app(argc, argv);

//单例的使用
qmlRegisterSingletonType<ImageHandle>("ImageHandle",1,0,"ImageHandle",configureProvider);

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

三,QML中使用

import 导入后 就可以直接使用了。

发表回复