使用QML共享C ++对象实例

时间:2018-04-11 15:15:42

标签: c++ qt c++11 qml

我在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的问题,但我正在寻找更优雅的解决方案。

1 个答案:

答案 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

工作正常