我在C++11中有一个逻辑业务,我需要使用QML公开和分享一些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++对象在QQmlApplicationEngine析构函数之前被QGuiApplication销毁。
当QQmlApplicationEngine试图在他的析构函数中访问这些伪单例对象时,我遇到了崩溃。
我可以通过跳过QQmlApplicationEngine (0)调用来解决这个问题,但是我正在寻找一个更优雅的解决方案。
发布于 2018-04-12 00:06:31
另一种选择是将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工作正常
https://stackoverflow.com/questions/49778780
复制相似问题