一些对象是全局唯一的,特别适合使用单列模式,比如网络,数据库,或者跟设备相关的功能,如串口,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 导入后 就可以直接使用了。