在我的主要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层次结构?
答案 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)
}