0
点赞
收藏
分享

微信扫一扫

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


项目资源和UI加载的流程

作者:虚坏叔叔

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

一、整体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;
}

构造函数中,继承了​​QApplication​​的2个方法

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

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

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

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

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

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

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

二、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函数流程,以及整个程序的初始化过程



举报

相关推荐

0 条评论