本文主要用来记录一下自己用C++及QT自己开发软件的经过。
开发背景,是针对公司目前外部采购的零部件,开发一个生成料号的系统。因为物料编号有一个统一的模板(格式),而且不能重复。
我的软件就是避免大家手动填写表格造成重复及格式混乱的问题。
我的想法就是通过QT编写一个ui界面,界面根据料号格式的需求,让大家按需填写。填写完成后生成对应的物料编号,并保存在一个数据库中。如果重复 or 格式错误则拒绝保存。
关于数据库,最初的想法使用MySQL,比较高大上。奈何本人不会……恰巧大家都有公司统一访问权限的公盘,那么思路二,就是料号都用csv格式的一个文件保存在公盘中。类似于一个本地局域网的“数据库”。当然这样也存在问题,后面再说。
有了思路,就开始编写工作。
第一步,就是可行性的问题,因为之前做过基于Python的PyQT软件,所以觉得大差不差,这个思路是走得通的;
第二步,配置环境。首先安装了常用的Visual Studio 2022。这是挖了一个坑。
网上查到可以利用VS的QT插件来编写代码,VS的体验要比QCreator好得多。于是直接下载了QT的插件。目前都很顺利。
直到安装QT,我首先下载了QT5.22版本。安装很久,而且安装了很多没用的模块(比如安卓模块等),安装好后发现找不到编译器和调试器。搜索了很久无果。最后毅然卸载,安装了新的QT6.3.1,问题迎刃而解。
第三步,开始开发。首先使用QT的designer,拖动并规划了一个大致的ui界面。然后使用VS的QT插件对生成的QT的.pro文件进行了转换。快速学习了一下转化后的文件,随后开始编写具体功能的代码。
之前实习写PyQt的软件,每天的工作没有记录,修改也不记录。最后复盘起来难度很大。这次尝试记录一份开发日志文件,同时针对每一次大的的修改做到:①添加代码备注,包括修改日期和修改原因;②大修改之前,将当前的整个工程备份。这样就不怕后期因为手欠而导致前功尽弃的状况。
贴上自己的开发日志:
- 2022.7.11
- 完成UI界面设计
- 2022.7.12
- 完成UI界面功能绑定
- 2022.7.13
- 完成基本软件功能开发(V1.0版本),可以实现用户自定义料号,实时生成,保存在本地csv文件中。
- 保存可以实现避免重复
-
- 优化方向:
- 1.文本框限制用户的输入内容,如一位字母的供应商代号处则仅可输入一位字母;(7.14完成一半,目前只能限制输入一位)(7.14实现无法输入数字,但对于汉字暂时不能过滤。【考虑Unicode编码的正则表达】)
- 2.提示文本不显示在输入框中,而是鼠标悬停显示;(7.14已实现)
- 3.界面添加帮助按钮,点击按钮出现基本操作提示。 (7.14已实现)
- 4.部署客户端,规定用户需要通过浏览获取到XXX.CVS文件的地址。(7.15已实现)
-
- 2022.7.14
- 优化:保存料号成功有用户提示,生成错误料号及料号重复会有错误提示。
- Debug, 针错误料号的保存逻辑进行了调整。
- 优化方向:
- 1.多个textEdit之间实现tab切换。(7.14已实现)
- 2.帮助提示框可以变成非模态的,方便用户操作(存在内存泄漏风险? 放弃)
- 2022.7.14 V1.1版
-
-
- 2022.7.15
- 优化方向:
- 初次使用提示用户,选取csv文件地址。(基于浏览本地文件功能实现后) (7.15已实现)
-
-
-
- ------------------------------------------
- 开发问题点记录:
- 1.如何设置使得textEdit将tab键按下视为切换焦点而不是输入?
- 2.如何判断重复?
- 3.设置文本框显示提示符以及鼠标悬停显示提示字符;
- 4.设置TextEdit仅能输入一个字母
这里针对开发问题进行记录解答:
问题1:如何设置使得textEdit将tab键按下视为切换焦点而不是输入?
分析:之所以存在这个问题,是因为我想实现通过Tab键切换不同的控件,结果发现使用Tab键后会输入一个制表符(大大空格)。网上百度了许多办法都不管用。
A:学会查看QT的官方文档,有个很简单的方法,setTabChangesFocus(true),功能如其名,设置即可。:
问题2:如何判断重复?
分析:问题产生是因为我将所有的料号都push到一个QStringList中,如果通过遍历,只能实现遍历到的当前元素与目标元素对比。无法做到一一对比。
A:还是QT的官方文档救了我,只需要使用QStringList的contains(目标元素)的方式即可。返回一个bool值的结果。
问题3:设置文本框显示提示符以及鼠标悬停显示提示字符
分析:这个是我的改进功能,为了方便用户。
A:如果文本框中显示灰色的提示字符【setPlaceholderText("想要显示的提示内容")】,用户输入内容后消失的方式,存在的问题是有些很短的文本框(只需输入一个字符的)却存在很长的说明文字,导致显示不完整。
而鼠标悬停显示说明文字的方式就更美观。【setToolTip("想要显示的提示内容")】
问题4:设置TextEdit仅能输入一个字母、限制输入长度。
分析:我有一个文本框,只允许输入一位字母。
A:解决方法是使用正则表达,QT的正则表达是QRegularExpression。
- QString text = qTextEdit->toPlainText();
- QRegularExpression re("[0-9]"); // problem marked: 目前只能排除数字 // 正则表达
- QRegularExpressionMatch match = re.match(text);
- if (match.hasMatch())
- {
- ui->SMtextEdit->clear();
- }
当然,目前只实现了不能输入数字,如何排除汉字、中英文标点、空白字符?还需要添加,其实就是正则表达还没学透。后续要继续优化。
有涉及到保密的内容用蓝笔涂抹了
软件启动,提示用户首先配置CSV(保存料号)的地址。
下拉框中针对不同的材料种类进行选择,无需一边查看文档,一边填写。
一个简单的帮助按钮,用户点击可以获得帮助。
点击配置CSV地址按钮,用户需要找到自己公盘的csv文件所在地。
如果用户点击取消或者没有点击配置csv地址按钮,点击保存料号会弹出警告窗口。
用户输入了对应的料号,点击生成料号,可以在软件底部预览。
确认料号无误,点击保存至本地,即可将生成的料号写入csv文件中。
如果用户未填写内容,点击生成料号按钮会弹出错误窗口。
如果用户生成了重复的料号,点击保存按钮会弹出错误窗口。
这是最终保存在本地的料号展示。
这是自己第一次从一个一句话的需求产出一个软件。
一定要做好开发的规划;
一定要做好日志文件的记录;
一定要做好软件版本更迭的记录。
开发完成后自己可以多测测bug,模拟用户的各种操作(正确的or错误的);
善用QT官方文档,善用baidu,善用qDebug();
最后,文件都保存在本地csv,万一有人删除了怎么办?万一有人恶意修改了怎么办?
后期要解决这个问题。
Anyway, 每天进步一点点!