在我的自定义类中访问QQmlApplicationEngine

时间:2018-08-21 10:31:26

标签: c++ qt qml

我正在使用QtQML中编写媒体播放器,我在目录中制作了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

2 个答案:

答案 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