Qt总结笔记
1   Qt语法
2   Qt学习资料
3   Qt程序发布的流程
- Qt Creator开发程序
- 选择release编译后,在源码文件夹之外会生成构建的文件夹,带有-Release尾缀,在这个目录下拷贝程序的exe二进制文件到一个新建的文件夹中。
- 运行windeployqt工具打包动态链接文件:
windeployqt program_name.exe
。确保提前添加环境变量PATH:C:\Qt\qt6release\bin
,否则找不到windeployqt程序。P.S. 使用vs cl终端运行windeployqt会同时拷贝vc_redist.x64.exe安装包(Microsoft Visual C++ 2015-2022 Redistributable (x64) - 14.36.32532,可以解决目标系统缺少dll动态链接库的报错),使用普通的终端运行windeployqt则不会拷贝这个文件(Warning: Cannot find Visual Studio installation directory, VCINSTALLDIR is not set.),但实际上可以手动拷贝dll动态链接库文件到程序根目录,可免去用户再次运行安装运行库。 - NSIS打包生成安装包:创建快捷方式、创建卸载程序、界面美化(模仿网易云音乐安装包)、判断是否正在运行、判断并安装VC运行库。
3.1   单文件封包流程
除了静态编译可以单文件的打包,动态链接编译开发也可以实现,这个需要使用三方封包工具了,一般都是使用Enigma Virtual Box进行单文件的打包。
单文件打包流程:
- 新建文件夹,拷贝qt程序exe,运行windeployqt.exe打包动态链接文件,拷贝额外的MS VC++ DLL文件
- 打开Enigma Virtual Box,选择打包的程序
- 选择好打包程序后会自动生成一个打包后的程序名
- 在增加文件选项里面选择 增加文件夹[递归] ,把前面创建存放文件的文件夹包含进去
- 在文件选项 选择压缩文件
- 执行封包
缺点:使用Enigma Virtual Box打包的单文件,有可能会被杀毒软件识别为病毒,比如Windows Defender。
4   Qt下载
资源名称 | 官方源下载地址 | 清华镜像源下载地址 |
---|---|---|
Qt资源总站 | 点击跳转 | 点击跳转 |
Qt源代码 | 点击跳转 | 点击跳转 |
Qt Creator | 点击跳转 | 点击跳转 |
Qt Linguist | 点击跳转 | 点击跳转 |
5   Qt Creator的总结
5.1   安装Qt Creator提示要求联网登录帐号
断网再打开Qt Creator的安装包,等跳过检测联网帐号的界面后就可以启用网络继续安装。
5.2   修改模板文件以便新建工程时默认支持C++20
使用程序完成批量修改:modify_qt_creator_template_files_to_support_c++20.bat
将以下文件中的set(CMAKE_CXX_STANDARD 17)
修改为set(CMAKE_CXX_STANDARD 20)
- qtcreator-16.0.0\share\qtcreator\templates\wizards\projects\consoleapp\CMakeLists.txt
- qtcreator-16.0.0\share\qtcreator\templates\wizards\projects\cpplibrary\CMakeLists.txt
- qtcreator-16.0.0\share\qtcreator\templates\wizards\projects\plaincpp\CMakeLists.txt
- qtcreator-16.0.0\share\qtcreator\templates\wizards\projects\qtquickapplication_compat\CMakeLists.txt
- qtcreator-16.0.0\share\qtcreator\templates\wizards\projects\qtwidgetsapplication\CMakeLists.txt
将以下文件中的CONFIG += c++17
修改为CONFIG += c++20
- qtcreator-16.0.0\share\qtcreator\templates\wizards\projects\consoleapp\file.pro
- qtcreator-16.0.0\share\qtcreator\templates\wizards\projects\cpplibrary\project.pro
- qtcreator-16.0.0\share\qtcreator\templates\wizards\projects\plaincpp\file.pro
- qtcreator-16.0.0\share\qtcreator\templates\wizards\projects\qtwidgetsapplication\project.pro
6   Qt国际化多语言的总结
QT官方多语言编程wiki参考:How to create a multi language application
- 创建工程文件时,勾选国际化选项。
- 打开CMakeLists.txt文件,修改
${TS_FILES}
对应的文件和手动生成需要的ts文件,找到if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
语句,在该if语句内添加如下内容,其中untitled
为项目名称。如果还需要创建对应资源文件的话,就创建languages.qrc并有qt资源编辑器打开编辑。
1 | qt_create_translation(QM_FILES ${CMAKE_SOURCE_DIR} ${TS_FILES}) |
- 编辑ui文件,编辑程序界面文本。
- 构建工程,ts文件会自动生成对应的文本(无需使用QT Creator的工具->外部->Linguist->Update/Release Translations(lupate),这个工具运行会报错)
6.1   创建工程提示找不到合适的套件
问题:安装Qt Creator之后,在创建工程提示No suitable kits found
.
解决:点击管理,手动设置构建套件kit的qt版本,这是通过选择qmake.exe或者qmake6.exe的路径确认。(不用重装,网上的教程都是重装或者安装在线版本包,但直接重装是无效)。
6.2   旧项目的套件配置文件中的CL编译器路径不正确
原因:更新MSVC CL后,老版本编译器就被删除了,旧项目的套件配置文件中的CL编译器路径仍然是老版本的路径,导致路径错误无法识别最新版本的编译器。
解决方法:删除项目父路径中生成的构建配置文件夹,例如build-untitled-x64-Release
,然后重新构建新的配置文件夹。
7   Qt源码编译
7.1   个人编译使用的模块
以下是我个人使用到的模块(按编译顺序列出)
- qtbase(基础库)
- qtshadertools(编译qtdeclarative所需的依赖库)
- qtdeclarative(qt quick和QML)
- qttools(CMakeLists文件中指明要Qt Linguist包,因此即使在qt creator中没用上「工具」->「外部」->「Linguist」也要编译)
- qtsvg(FluentUI库所需)
- qt5compat(FluentUI库所需)
qttranslation(如果不编译这个库,运行windeployqt会出现警告:Warning: Translations will not be available due to the following error. Cannot open C:/Qt/qt6release/translations/catalogs.json
。但这个错误实际不影响程序的翻译状态,可以不编译)
7.2   环境配置和编译步骤
环境变量:一定要确保系统PATH环境变量含有CMake和Ninja路径。关于如何详细设置,可以参见MSVC CL编译器的安装和环境设置。
注意不能使用ninja直接构建源码,会报错:build.ninja not found。构建是使用CMake。
编译步骤:
- 将源码解压到分区的根目录下,例如:
G:\qtbase-everywhere-src-6.8.2
- 在源码文件夹外新建一个文件夹,如
qtbasebuild
,拷贝该编译脚本进文件夹,打开cmd窗口,执行该脚本(不建议直接双击运行编译脚本,因为脚本编译出错或者执行完毕都会关闭窗口,这样无法得知编译详情)。 - 编译完成后添加环境变量PATH配置:
C:\Qt\qt6release\bin
7.3   单模块逐个编译的BAT脚本
附加编译子模块的方式:运行Qt安装路径下的/bin/qt-configure-module.bat + 附件模块源码解压路径。
一般普通开发编译release版本即可,debug版本是是编译用来开发调试qt源码的。
7.3.1   编译release版本
7.3.1.1   编译qtbase(release)
1 | @chcp 65001>nul |
7.3.1.2   附加编译其他子模块(release)
1 | @chcp 65001>nul |
7.3.2   编译debug版本
7.3.2.1   编译qtbase(debug)
1 | @chcp 65001>nul |
7.3.2.2   附加编译其他子模块(debug)
1 | @chcp 65001>nul |