分类 Qt 下的文章

又到了每年闲下来,嚷嚷着要开坑新项目的季节了。然而仔细一想,去年挖坑说是要填的CHIP8还没有动手呢。

你怎么回事,小老弟.jpg

然而不得不承认的是,打开Visual Studio,创建好一个名为CHIP8的项目,可以说是人类历史上的一大壮举了。俗话说的好,良好的开端是成功的一半嘛。(大雾)

经历了今年整个冬春COVID的闭门不出,一个夏天的人心惶惶,一个秋天的摸爬滚打,让人感慨万千。又到了冬天,而一切又总算是回到了正轨。好在功夫不负有心人,过去几年的努力没有白费,未来几年总算不愁没饭吃了。

回到正题,Qt的部署方式和常规的应用开发是有区别的。普通应用的开发,只要把依赖库按照编译时的需求配置好,环境变量配置好,就可以带着到处跑。

但是Qt不行,如果按照传统思维的缺啥补啥的思路的话,Qt反而会报错,提示类似Qt安装损坏的信息。

后来到网上搜索后发现,Qt是有一套平台部署工具的(https://doc.qt.io/qt-5/windows-deployment.html),按照里面的说明,执行`windeployqt.exe`,即可自动完成应用部署。部署完成后,目标目录下会出现一大堆依赖文件,跟随应用一起打包即可

让Visual Studio在每次编译完成后自动部署Qt应用的方法是,右键项目->生成事件->生成后事件,在此可以利用Visual Studio的内置变量辅助完成自动部署指令的编写。可以理解为,在这里执行的命令行是通过cmd.exe执行的,因而需要使用CMD语法。

Release配置文件下的命令可以写成如下形式:

"$(QMake_QT_HOST_BINS_)/windeployqt.exe" --release "$(TargetPath)"

需要注意一下的是,如果不使用--dir选项指定为文件夹形式(让windeployqt.exe自行搜索Qt可执行文件)的话,$(TargetPath)位置需要填写项目的Qt可执行文件位置。

相比于用C++写Qt,PyQt更加适合小项目入手,在单文件/单窗口的情况下更容易入手。

静态加载.ui文件需要使用pyuic5进行编译,然后作为库引入,使用一个类去继承该类即可使用。在这个类中,组件可以通过使用ui中指定的objectName直接进行获取,类似于Android中的findViewById

接下来是一些坑:

  1. 组件具有线程绑定性,只能在主线程内更新组件(包括设置组件内容),否则好的情况抛出Exception,坏的情况直接Segmentation Fault退出了,此时只能通过Qt的信号/槽机制来;
  2. 即便是新建QMessageBox也最好在主线程中进行(同样是信号/槽机制),否则可能可以展示信息,但是会出一些奇奇怪怪的错误,我这里遇到的情况就有诸如包含空格就段错误的情景。

发现新版的Qt在线安装要注册账号= =

作为一个非专业图形界面编程人员,自然对注册账号不感兴趣,然后去找老版本。

然后到Qt的下载站一看,Qt5的下载只剩下了5.9-5.14的文件夹???遂心想,Qt啊Qt,你终于也走上Intel的老路了吗。
http://download.qt.io/archive/qt/ <- 这个地址,也是网上绝大部分博客提供的地址)

就在心中即将开始谴责万恶的资本主义值制度的时候,突然发现了一个名叫new_archive的新文件夹,所有5.1-5.8的安装包都在里面。重点是这个文件夹在2019年就创建了,国内的镜像源(指tuna和ustc)竟然到现在(2020年5月)都还没提上同步日程= =
http://download.qt.io/new_archive/qt/ <- 这个是目前包含了老版本的新归档文件夹)

顺带记录一下,支持XP的最新版本是Qt5.6,这也是一个LTS版本。

因为不愿意离开宇宙最强的IDE,所以选择了在Visual Studio中安装插件的方式来进行Qt程序开发。

鬼知道Qt插件为什么在有这么明显的bug的时候还直接传上来啊!

一打开项目,所有自动生成的代码全部飘红,这我还用个毛线球啊!

问题主要有以下两个:

  1. 所有的#include标记全部显示“无法打开源文件”。该问题的确可以通过修改项目的包含目录include path实现,但是这不是最佳的解决方案——如果这些工作都需要手动配置的话,我还要这插件作甚?
  2. 其中以ui_格式开头的头文件,即使在设置了包含目录后也还是找不到。

解决方案如下:

  1. 这实际上是Qt插件版本的锅。在我使用的时候,VS2019扩展市场提供的是2.4.3版本的插件。在StackOverflow上看到的提问中有人提到了插件版本的问题,于是考虑是否与这个有关。按照地址下载了一个2.4.2 Rev.14的插件重新安装后,问题解决。当然不要忘记对插件的Qt版本进行配置——默认插件是不会寻找你电脑里已经安装的版本的,需要手动配置库的位置。
  2. ui_xxxx.h形式的文件是Qt编译时产生的。在使用插件正确完成配置后,可以考虑直接生成一下项目,这样msbuild会调用相关的Qt动作以生成对应的文件。