项目资源和UI加载的流程
作者:虚坏叔叔
博客:https://xuhss.com
早餐店不会开到晚上,想吃的人早就来了!
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
函数做了所有的额初始化操作:
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()<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("com.imooc.myplayer", 1, 0, "MainApp",
&MainApp::GetInstance);
qmlRegisterType("com.imooc.myplayer", 1, 0, "MYPlay");
qmlRegisterType("com.imooc.myplayer", 1, 0, "MYVideoOutput");
// Load main UI qml from resource
pQmlEngine->load(QUrl(QStringLiteral(UI_MAIN_PATH)));
QList rootObjs(pQmlEngine->rootObjects());
return !rootObjs.isEmpty();;
}
qml
引擎加载起来了 界面就可以跑起来了。
点赞
收藏
转发
一波哦学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
Python实战微信订餐小程序 | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
Python量化交易实战 | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️ | 难度偏高 | 分享学习QT成品的视频播放器源码,需要有扎实的C++知识! |
游戏爱好者九万人社区 | 互助/吹水 | 九万人游戏爱好者社区,聊天互助,白嫖奖品 |
Python零基础到入门 | Python初学者 | 针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门 |
关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种小程序、Web、客户端项目源码等等资料。更多内容可自行查看哦!