我正在使用Qt
在QML
中编写媒体播放器,我在目录中制作了Qlist
首歌曲,并且希望将此列表作为模型发送到QML文件,但我不知道如何访问自定义类Player
中main中声明的引擎。
所以,有我的main.cpp
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QApplication app(argc, argv);
qmlRegisterType<Player>("io.qt.examples.player", 1, 0, "Player");
QQmlApplicationEngine engine;
Player player;
engine.rootContext()->setContextProperty("player", &player); // this works fine
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
在我的Player
类中,我想设置另一个属性,并且发现以下代码可以帮助您:
QQmlContext *currentContext = QQmlEngine::contextForObject(this); // debugger says it's null
QQmlEngine *engine = currentContext->engine(); // Segmentation fault
当调试器到达此行时,出现分段错误错误,我已经使用文件名正确设置了QStringList
,并希望这样做:
engine->rootContext()->setContextProperty("listModel", QVariant::fromValue(files));
我想在那里使用此模型:
ListView {
id: listView
model: listModel
delegate: Rectangle {
Text {
text: modelData
}
}
}
但是还会出现QML错误:ReferenceError: listModel is not defined
答案 0 :(得分:0)
在没有完整示例的情况下,我将尽力回答这个问题。
调试器到达此行时出现分段错误错误
问题可能是引擎未构造类型。 docs说:
当QQmlEngine实例化QObject时,将自动设置上下文。
因此,您可能需要set the context manually。通常,这是通过使用引擎已知的对象中的上下文来完成的:
QQmlEngine::setContextForObject(this, qmlContext(someQmlObject))
但是还会出现QML错误:ReferenceError:未定义listModel
同样,我无权访问完整的示例,因此我只能猜测,而我的猜测是您设置context属性为时已晚。应该在加载使用上下文属性的QML之前设置上下文属性。
但是我建议您不要设置上下文属性,而是创建一个proper model并将其注册为可以在QML中实例化的类型。
有关C ++和QML集成的各种方法的更多信息,请查看this。
答案 1 :(得分:0)
实际上,我找到了答案here,更改了方法,并将QStringList模型切换为Q_PROPERTY