如何将 QML MediaPLayer 与 C++ 端集成

How can I integrate QML MediaPLayer with C++ side

我使用 MediaPlayer 元素开发了一个基于 QML 的视频播放器程序。该程序具有视频播放器的大部分基本功能(播放、暂停、音量 up/down、前进、后退等)。我的下一个任务是为视频添加字幕,我需要使用 MediaPlayer 元素的 metaObject 方法,但 QML 端确实允许该功能,它说:

Note: This property is not accessible from QML.

文档中有一个metaObject相关的描述让我很困惑:

mediaObject : variant
This property holds the native media object.

It can be used to get a pointer to a QMediaPlayer object in order to integrate with C++ code.

QObject *qmlMediaPlayer; // The QML MediaPlayer object
QMediaPlayer *player = qvariant_cast<QMediaPlayer *>(qmlMediaPlayer->property("mediaObject"));

这是什么意思?如何将 QML MediaPlayer 与 C++ 集成?任何帮助都会很棒,谢谢。

这将取决于您启动 QML 应用程序的具体方式。假设是这样设置的:

int main(int argc, char **argv)
{
   // Q(Gui)Application setup...
    
   QQmlApplicationEngine engine;
   engine.load(QUrl("qrc:/main.qml"));

   // ...
}

在 QML 对象层次结构中的某处,您有一个 MediaPlayer:

MediaPlayer {
    objectName: "player"
    // ...
}

重要的是设置objectName 属性,这样您就可以在C++代码中通过这个名称查找MediaPlayer实例。如上所述加载 QML 文档后,引擎有一个根对象,您可以使用 findChildfindChildren(改编自 this answer)进行搜索:

auto qmlPlayer = engine.rootObjects()[0]->findChild<QObject*>("player");
auto player = qvariant_cast<QMediaPlayer*>(qmlPlayer->property("mediaObject"));
// use the QMediaPlayer*