我正在用Qt编写一个使用QML的媒体播放器,我正在一个目录中提供一个歌曲的Qlist,我想将这个列表作为模型发送到QML文件,但是我不知道如何访问在我的自定义类Player中声明的引擎。
这是我的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
发布于 2018-08-21 12:04:55
实际上,我找到了答案这里,改变了我的方法,并将QStringList模型转换为Q_PROPERTY
发布于 2018-08-21 10:49:09
没有完整的例子,我会尽我所能地回答这个问题。
当调试器到达这一行时,我得到了一个分段错误错误
该问题可能是该类型不是由引擎构造的。文档说:
当QQmlEngine实例化QObject时,上下文将自动设置。
所以你可能需要手动设置上下文。通常,这是通过使用由引擎构造的对象的上下文来完成的:
QQmlEngine::setContextForObject(this, qmlContext(someQmlObject))但是也得到一个QML错误: ReferenceError: listModel没有定义
同样,我无法访问完整的示例,因此只能猜测,我的猜测是设置上下文属性太晚了。应该在加载使用它们的QML之前设置上下文属性。
不过,我建议您不要设置上下文属性,而是创建一个适当模型并将其注册为可以在QML中实例化的类型。
有关C++和QML集成的各种方法的更多信息,请查看这。
https://stackoverflow.com/questions/51946711
复制相似问题