项目资源和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);
如果初始化错误就需要反初始化,初始化成功之后,会走进exec()
函数里面,
它是父类QApplication
的静态方法,这个方法里面是死循环,界面出发关闭按钮才会退出循环,从而推出程序的执行。
二、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函数流程,以及整个程序的初始化过程