C++ QT结合FFmpeg实战开发视频播放器-09项目资源和UI加载的流程

qt xuhss 606℃ 0评论

作者:虚坏叔叔
博客:https://xuhss.com

早餐店不会开到晚上,想吃的人早就来了!?

一、整体main函数流程

main函数中,主要是创建了一个MainApp的对象,这个对象是我们自己定义的,

int main(int argc, char *argv[])
{
    QQuickWindow::setSceneGraphBackend(QSGRendererInterface::Software);
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    MainApp app(argc, argv);

    g_pApp = &app;
    int nRet = app.Main(argc, argv);
    g_pApp = nullptr;

    return nRet;
}

构造函数中,继承了QApplication2个方法

MainApp::MainApp(int &argc, char **argv)
       : QApplication(argc, argv)
       , m_strAppRootPath()
       , m_strImageRootPath()
{
}

初始化了父类的2个参数,子类的2个参数默认初始化。最主要的逻辑实在这行代码里面:

int nRet = app.Main(argc, argv);

20220421065556 - C++ QT结合FFmpeg实战开发视频播放器-09项目资源和UI加载的流程

如果初始化错误就需要反初始化,初始化成功之后,会走进exec()函数里面,

它是父类QApplication的静态方法,这个方法里面是死循环,界面出发关闭按钮才会退出循环,从而推出程序的执行。

20220421065945 - C++ QT结合FFmpeg实战开发视频播放器-09项目资源和UI加载的流程

二、Initialize函数处理

Initialize函数做了所有的额初始化操作:

InitializePath()初始化成员变量的路径

bool MainApp::InitializePath()
{
    // Application directory path
    m_strAppRootPath = qApp->applicationDirPath();
    QDir dirApp(m_strAppRootPath);
    if (!dirApp.exists())
        {return false;}

    // Image root directory path
    m_strImageRootPath = m_strAppRootPath;
    m_strImageRootPath.append(QStringLiteral("/")).append(QStringLiteral(IMAGEDIR_RELATIVE_PATH));
    QDir dirImg(m_strImageRootPath);
    if (!dirImg.exists())
    {
    }
    m_strImageRootPath = dirImg.canonicalPath();

    return true;
}

InitializeCfg()初始化配置文件

bool MainApp::InitializeCfg()
{
    return true;
}

InitializeTranslator()初始化翻译器

m_pTranslator.reset(new QTranslator); //重设翻译器

installTranslator(m_pTranslator.data()); //调用父类的函数去完成翻译器的安装

bool MainApp::InitializeTranslator()
{
    if (m_pTranslator != nullptr)
        {return true;}

    // Load translation from resource
    m_pTranslator.reset(new QTranslator);
    QSettings *settingIni = new QSettings("setting.ini",QSettings::IniFormat);

    QString Language = settingIni->value("Config/Language").toString();
    qDebug()<<Language<<endl;
    if(Language == NULL)
    {
        settingIni->setValue("Config/Language",QString("Chinese"));
        Language = settingIni->value("Config/Language").toString();
    }
    setLanguage(Language);
    if(Language == "Chinese")
    {
        if (!m_pTranslator->load(QStringLiteral(UI_TRANSLATION_PATH)))
            {return false;}
        // Add translator
        installTranslator(m_pTranslator.data());
    }
    if(Language == "English")
    {

    }
    delete settingIni;
    return true;
}

翻译器的反初始化过程:

removeTranslator(m_pTranslator.data()); //调用父类的函数去完成翻译器的卸载

m_pTranslator.reset(); //reset为空

bool MainApp::UninitializeTranslator()
{
    if (!m_pTranslator)
        {return true;}

    // Remove translator
    removeTranslator(m_pTranslator.data());

    // Free translator instance
    m_pTranslator.reset();

    return true;
}

InitializeQmlEngine()初始化Qml引擎

bool MainApp::InitializeQmlEngine()
{
    if (m_pQmlEngine != nullptr)
        {return true;}

    // Create QML engine instance
    m_pQmlEngine.reset(new QQmlApplicationEngine);

    return (nullptr != m_pQmlEngine);
}

InitializeUI(QQmlApplicationEngine* pQmlEngine)初始化UI

qmlRegisterSingletonType("com.imooc.myplayer", 1, 0, "MainApp",
&MainApp::GetInstance); // 将MainApp类注册到qml引擎

pQmlEngine->load(QUrl(QStringLiteral(UI_MAIN_PATH))); // 完成qml资源的加载载,通过加载qml文件

bool MainApp::InitializeUI(QQmlApplicationEngine* pQmlEngine)
{
    if (pQmlEngine == nullptr)
        {return false;}

    // 设置程序默认字体
    setFont(QFont(DEFAULT_FONT_NAME, 9));

    // Register Qml Types
    qmlRegisterSingletonType<MainApp>("com.imooc.myplayer", 1, 0, "MainApp",
                                      &MainApp::GetInstance);
    qmlRegisterType<MYPlay>("com.imooc.myplayer", 1, 0, "MYPlay");
    qmlRegisterType<MYVideoOutput>("com.imooc.myplayer", 1, 0, "MYVideoOutput");

    // Load main UI qml from resource
    pQmlEngine->load(QUrl(QStringLiteral(UI_MAIN_PATH)));
    QList<QObject*> rootObjs(pQmlEngine->rootObjects());
    return !rootObjs.isEmpty();;
}

qml引擎加载起来了 界面就可以跑起来了。

三、总结

  • 本文主要讲解main函数流程,以及整个程序的初始化过程
  • 如果觉得文章对你有用处,记得 点赞 收藏 转发 一波哦

? 往期优质文章分享

? 优质教程分享 ?

  • ?如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
  • ?比如以下几个专栏:Python实战微信订餐小程序、Python量化交易实战、C++ QT实战类项目 和 算法学习专栏
  • ?可以学习更多的关于C++/Python的相关内容哦!直接点击下面颜色字体就可以跳转啦!
学习路线指引(点击解锁) 知识定位 人群定位
? Python实战微信订餐小程序 ? 进阶级 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
?Python量化交易实战? 入门级 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️ 难度偏高 分享学习QT成品的视频播放器源码,需要有扎实的C++知识!
? 游戏爱好者九万人社区? 互助/吹水 九万人游戏爱好者社区,聊天互助,白嫖奖品
? Python零基础到入门 ? Python初学者 针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门

? 资料白嫖,温馨提示 ?

关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种小程序、Web、客户端项目源码等等资料。更多内容可自行查看哦!

2e3d1f57d8cc4b689c0ec284120b1acc - C++ QT结合FFmpeg实战开发视频播放器-09项目资源和UI加载的流程

转载请注明:xuhss » C++ QT结合FFmpeg实战开发视频播放器-09项目资源和UI加载的流程

喜欢 (2)

您必须 登录 才能发表评论!