如何从qmlRegisterSingletonType的回调中访问QML加载的项?

时间:2017-02-24 16:15:43

标签: c++ qt qml

在我的主要QML文件中,我定义了一个MediaPlayer。要对媒体缓冲区进行低级访问(通过QAudioProbe),我需要获取对其mediaObject的引用。我的C ++后端通过qmlRegisterSingletonType注册的类与UI进行交互。

的main.cpp

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);
    qmlRegisterSingletonType<BackendInterface>("_", 0, 1, "Backend", backendInterfaceProvider);
    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));

    return app.exec();
}

这是回调:

static QObject *backendInterfaceProvider(QQmlEngine *engine, QJSEngine *scriptEngine)
{
    Q_UNUSED(engine)
    Q_UNUSED(scriptEngine)

    return new BackendInterface(/* need a QMediaPlayer* here*/);
}

问题

如何在创建后端界面(即BackendInterface)时访问QML层次结构?

1 个答案:

答案 0 :(得分:4)

由于你有一个单例类型的对象,它将在第一次使用时创建,此时你的MediaPlayer对象可能还不存在。

不要试图从QML中检索MediaPlayer,而是让QML用C ++“注册”对象,即将对象传递给单例。

这样的东西
class BackgroundInterface : public QObject
{
    Q_OBJECT

public:
    Q_INVOKABLE void registerMediaPlayer(QObject *player);
};

MediaPlayer {
   id: mediaPlayer

   Component.onCompleted: Backend.registerMediaPlayer(mediaPlayer)
}