与 QML 共享C++对象实例
Share C++ object instances with QML
我在 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
工作正常
相关文章:
- 对象实例化调用构造函数的次数太多
- 为什么C++无法识别我的对象实例化?
- 使用大括号和 : 符号的对象实例化
- 对象实例化与类型C++
- 如何在C++中传递lambda函数内部的对象实例
- 在 c++ 中重置大型对象实例的最佳方法是什么
- 从 QT Widget 对象实例访问 QT Widget 子成员
- C++阻止用户创建对象实例
- cpp 静态对象实例化
- C++:根据变量将同一对象实例化为多种类型之一
- 与 QML 共享C++对象实例
- C 对象实例被销毁后留在列表上
- vulkan vulkan.hpp从对象实例中获取opbject类型
- 用户创建的类对象实例化的未申请标识符
- 对象实例化后不输出
- 限制对象实例化堆
- C C#等价对象实例
- 在C 中运行时从指针访问对象实例
- 使用类/对象实例数据初始化对话框
- 未知的 C++ 对象实例化语法