首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与QML共享C++对象实例

与QML共享C++对象实例
EN

Stack Overflow用户
提问于 2018-04-11 23:15:42
回答 1查看 344关注 0票数 1

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

我使用了一种伪单例方法来用lambda和静态变量公开这些对象:

代码语言:javascript
复制
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)调用来解决这个问题,但是我正在寻找一个更优雅的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2018-04-12 00:06:31

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

然后,注册对象

代码语言:javascript
复制
SingletonContext::instance()->Context()->setContextProperty("Plclink",&m_link );

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

示例:使用setContextProperty

代码语言:javascript
复制
onActivated: {
                    Plclink.setvaluechanged(Plclink.DB_PROGRAMA ,Plclink.DBW_ENCURSO,index )
                }

失败(Q_ENUM DB_PROGRAMA始终为0)

但是有了

代码语言:javascript
复制
static plclink *slink=&m_link;
qmlRegisterSingletonType<plclink>("Plclink", 1, 0, "Plclink", [](QQmlEngine *engine, QJSEngine *scriptEngine) -> QObject * {
    Q_UNUSED(engine) Q_UNUSED(scriptEngine)
            return slink;
});

代码语言:javascript
复制
  import Plclink 1.0

工作正常

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49778780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档