简而言之,我想创建一个类似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
)实例
Settings
我注册// =============================================================
/// 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*
QMetaProperty::read: Unable to handle unregistered datatype 'SnapshotSettings' for property 'Settings::snapshot'
main.qml:52: TypeError: Cannot read property saveDirectory' of undefined
似乎没必要,因为我将其实例作为上下文传递给QML,而不是在QML中将其实例化?
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
)
我的问题是:也许我真的做过反模式?如果是的话,有没有更好的方法呢?
感谢。
答案 0 :(得分:0)
您的snapshot
属性必须是SnapshotSettings*
类型,即指向SnapshotSettings
的指针,因为该类是QObject且无法复制。
您还应该将该属性标记为CONSTANT
,因为指针永远不会改变。
saveDirectory
属性需要NOTIFY
信号或CONSTANT
,具体取决于它是否可以在运行时更改。