作者:虚坏叔叔
博客: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;
}
构造函数中,继承了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函数流程,以及整个程序的初始化过程
- 如果觉得文章对你有用处,记得
点赞
收藏
转发
一波哦
? 往期优质文章分享
- C++ QT结合FFmpeg实战开发视频播放器-01环境的安装和项目部署
- 解决QT问题:运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
- 解决安装QT后MSVC2015 64bit配置无编译器和调试器问题
- Qt中的套件提示no complier set in kit和no debugger,出现黄色感叹号问题解决(MSVC2017)
- Python+selenium 自动化 - 实现自动导入、上传外部文件(不弹出windows窗口)
? 优质教程分享 ?
- ?如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
- ?比如以下几个专栏:Python实战微信订餐小程序、Python量化交易实战、C++ QT实战类项目 和 算法学习专栏
- ?可以学习更多的关于C++/Python的相关内容哦!直接点击下面颜色字体就可以跳转啦!
学习路线指引(点击解锁) | 知识定位 | 人群定位 |
---|---|---|
? Python实战微信订餐小程序 ? | 进阶级 | 本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。 |
?Python量化交易实战? | 入门级 | 手把手带你打造一个易扩展、更安全、效率更高的量化交易系统 |
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️ | 难度偏高 | 分享学习QT成品的视频播放器源码,需要有扎实的C++知识! |
? 游戏爱好者九万人社区? | 互助/吹水 | 九万人游戏爱好者社区,聊天互助,白嫖奖品 |
? Python零基础到入门 ? | Python初学者 | 针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门 |
? 资料白嫖,温馨提示 ?
关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种小程序、Web、客户端项目源码等等资料。更多内容可自行查看哦!