如何制作类似JSON的QObject

时间:2016-10-27 02:46:43

标签: qt qml qt-creator moc qproperty

简而言之,我想创建一个类似JSON的对象,QML / Qt C ++端可以轻松访问它。

在QML中,我可以创建一个settings对象:

Item {
    id: settings
    property alias snapshot: snapshot
    QtObject {
        id: snapshot
        property string saveDirectory: "~/hello/world/"
  }
}

并将其设为单身,现在我们可以通过settings.snapshot.saveDirectory访问数据。

但是在C ++中访问它是非常不方便的,所以我尝试在C ++中执行此任务:创建一个类Settings,将实例建立为settings,然后将其传递给{{1}作为一个上下文。 (整个应用程序只有一个QQmlApplicationEngine)实例

state.cpp

Settings

的main.cpp

  1. 我注册// ============================================================= /// Settings is parent class Settings : public QObject { Q_OBJECT Q_PROPERTY(SnapshotSettings* snapshot READ snapshot) // <- It's pointer, very important! public: explicit Settings(QObject *parent=0) : m_snapshot_settings(new SnapshotSettings) {} private: SnapshotSettings* m_snapshot_settings; } // ============================================================= // SnapshotSettings is the child of Settings class SnapshotSettings : public QObject { Q_OBJECT Q_PROPERTY(QString saveDirectory READ saveDirectory) public: explicit Settings(QObject *parent=0) : m_save_directory("~/hello/world/") {} private: QUrl m_save_directory; } 类型。否则,它说:

    SnapshotSettings*
  2. QMetaProperty::read: Unable to handle unregistered datatype 'SnapshotSettings' for property 'Settings::snapshot' main.qml:52: TypeError: Cannot read property saveDirectory' of undefined 似乎没必要,因为我将其实例作为上下文传递给QML,而不是在QML中将其实例化?

  3. qmlRegisterType<>()
      

    有人告诉我,我制作了C ++ / QML的反模式......,说“我从来没有看到有人喜欢这样”。

    现在似乎好了,我可以在QML中使用#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtQml> #include <QQmlContext> #include "state.cpp" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; Settings settings; // ....Am I right? qRegisterMetaType<SnapshotSettings*>("SnapshotSettings"); // This seems unnecessary because I use its instance as a context? // qmlRegisterType<Settings>("com.aisaka.taiga", 0, 1, "Settings"); engine.rootContext()->setContextProperty("settings", &settings); engine.addImportPath(QStringLiteral(":/qml")); engine.load(QUrl("qrc:/qml/main.qml")); return app.exec(); } 。但是在QtCreator中,自动完成工作不正确。settings.snapshot.saveDirectory后不会显示saveDirectory

    我的问题是:也许我真的做过反模式?如果是的话,有没有更好的方法呢?

    感谢。

1 个答案:

答案 0 :(得分:0)

您的snapshot属性必须是SnapshotSettings*类型,即指向SnapshotSettings的指针,因为该类是QObject且无法复制。

您还应该将该属性标记为CONSTANT,因为指针永远不会改变。

saveDirectory属性需要NOTIFY信号或CONSTANT,具体取决于它是否可以在运行时更改。