【问题标题】:How can I integrate QML MediaPLayer with C++ side如何将 QML MediaPLayer 与 C++ 端集成
【发布时间】:2022-08-24 21:00:13
【问题描述】:

我使用 MediaPlayer 元素开发了一个基于 QML 的视频播放器程序。该程序具有视频播放器的大部分基本功能(播放、暂停、音量上/下、前进、后退等)。我的下一个任务是为视频添加字幕,我需要使用 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++ 集成?任何帮助都会很棒,谢谢。

    标签: c++ qt qml qmediaplayer


    【解决方案1】:

    这将取决于您启动 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*
    

    【讨论】:

    • 谢谢你,我很感激!经过几次尝试,我发现objectName必须写在引号中(objectName:“player”)。你能纠正你的答案吗?
    • @quteguy你是对的,对此感到抱歉!
    【解决方案2】:

    我是 QT 的新手,并尝试将 C++ 输出发送到 QML。您是否可以在有或没有 .pro 文件的情况下共享有关 QMediaPlayer 部分的代码?谢谢 。

    【讨论】:

      猜你喜欢
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2016-09-03
      • 2013-05-06
      • 2023-03-09
      相关资源
      最近更新 更多