我在C ++ 11和C ++中有一个逻辑商务 我需要使用QML UI公开和分享一些C ++ QObjetcts。
我使用伪单例方法用lambda和static变量公开这些对象:
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;
});
工作正常,但是当应用程序退出时,我会收到错误,因为
在QGuiApplication
析构函数之前,QQmlApplicationEngine
会销毁C ++对象。
当QQmlApplicationEngine
尝试在析构函数中访问这些伪单例对象时,我会崩溃。
我可以通过exit(0)调用来解决QQ10ApplicationEngine的问题,但我正在寻找更优雅的解决方案。
答案 0 :(得分:0)
其他选项是在单个对象中存储QQmlContext
然后,注册对象
SingletonContext::instance()->Context()->setContextProperty("Plclink",&m_link );
问题是我可以从QTCreator访问函数,并且没有注册Q_ENUM变量
例如: with 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
工作正常