【问题标题】:Share C++ object instances with QML与 QML 共享 C++ 对象实例
【发布时间】:2018-09-21 13:23:06
【问题描述】:

我在 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++ 对象在QQmlApplicationEngine 析构函数之前被QGuiApplication 销毁。

当QQmlApplicationEngine 尝试在他的析构函数中访问这些假单例对象时,我遇到了崩溃。

我可以通过 exit(0) 调用跳过 QQmlApplicationEngine 来解决它,但我正在寻找更优雅的解决方案。

【问题讨论】:

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


    【解决方案1】:

    其他选项是将 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
    

    工作正常

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 2020-05-22
      • 2017-10-14
      • 1970-01-01
      • 2020-11-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      • 2014-10-16
      相关资源
      最近更新 更多