与 QML 共享C++对象实例

Share C++ object instances with QML

本文关键字:对象 实例 C++ 共享 QML      更新时间:2023-10-16

我在 C++11 中有一个逻辑业务,我需要使用 QML UI 公开和共享一些C++ QObjetcts。

我使用假单例方法使用lambda和静态变量公开这些对象:

static classname *static_pointer=&non_singleton_QObject_instance;
qmlRegisterSingletonType<classname>("ClassName", 1, 0, "ClassName", 
[](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
Q_UNUSED(engine) Q_UNUSED(scriptEngine) 
return static_pointer;
});

它工作正常,但是当应用程序退出时,我收到错误,因为 C++对象在析构函数之前由QGuiApplication销毁QQmlApplicationEngine

QQmlApplicationEngine尝试在他的析构函数中访问这些假单例对象时,我遇到了崩溃。

我可以通过 exit(0) 调用跳过 QQmlApplicationEngine 来解决它,但我正在寻找一个更优雅的解决方案。

另一种选择是将 QQmlContext 存储在单例对象中

然后,注册对象

SingletonContext::instance()->Context()->setContextProperty("Plclink",&m_link );

问题是我可以从 QTCreator 访问函数,并且Q_ENUM变量未注册

例: 与 setContextProperty

onActivated: {
Plclink.setvaluechanged(Plclink.DB_PROGRAMA ,Plclink.DBW_ENCURSO,index )
}

失败(Q_ENUM DB_PROGRAMA始终为 0)

但与

static plclink *slink=&m_link;
qmlRegisterSingletonType<plclink>("Plclink", 1, 0, "Plclink", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
Q_UNUSED(engine) Q_UNUSED(scriptEngine)
return slink;
});

import Plclink 1.0

工作正常