• 【开发记录】基于C++,使用QT+VS编写软件


    本文主要用来记录一下自己用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的软件,每天的工作没有记录,修改也不记录。最后复盘起来难度很大。这次尝试记录一份开发日志文件,同时针对每一次大的的修改做到:①添加代码备注,包括修改日期和修改原因;②大修改之前,将当前的整个工程备份。这样就不怕后期因为手欠而导致前功尽弃的状况。

    贴上自己的开发日志:

    1. 2022.7.11
    2. 完成UI界面设计
    3. 2022.7.12
    4. 完成UI界面功能绑定
    5. 2022.7.13
    6. 完成基本软件功能开发(V1.0版本),可以实现用户自定义料号,实时生成,保存在本地csv文件中
    7. 保存可以实现避免重复
    8. 优化方向:
    9. 1.文本框限制用户的输入内容,如一位字母的供应商代号处则仅可输入一位字母;(7.14完成一半,目前只能限制输入一位)(7.14实现无法输入数字,但对于汉字暂时不能过滤。【考虑Unicode编码的正则表达
    10. 2.提示文本不显示在输入框中,而是鼠标悬停显示;(7.14已实现)
    11. 3.界面添加帮助按钮,点击按钮出现基本操作提示7.14已实现)
    12. 4.部署客户端,规定用户需要通过浏览获取到XXX.CVS文件的地址7.15已实现)
    13. 2022.7.14
    14. 优化:保存料号成功有用户提示,生成错误料号及料号重复会有错误提示
    15. Debug, 针错误料号的保存逻辑进行了调整
    16. 优化方向:
    17. 1.多个textEdit之间实现tab切换(7.14已实现)
    18. 2.帮助提示框可以变成非模态的,方便用户操作(存在内存泄漏风险? 放弃)
    19. 2022.7.14 V1.1
    20. 2022.7.15
    21. 优化方向:
    22. 初次使用提示用户,选取csv文件地址(基于浏览本地文件功能实现后) (7.15已实现)
    23. ------------------------------------------
    24. 开发问题点记录:
    25. 1.如何设置使得textEdit将tab键按下视为切换焦点而不是输入?
    26. 2.如何判断重复?
    27. 3.设置文本框显示提示符以及鼠标悬停显示提示字符;
    28. 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。

    1. QString text = qTextEdit->toPlainText();
    2. QRegularExpression re("[0-9]"); // problem marked: 目前只能排除数字 // 正则表达
    3. QRegularExpressionMatch match = re.match(text);
    4. if (match.hasMatch())
    5. {
    6. ui->SMtextEdit->clear();
    7. }

    当然,目前只实现了不能输入数字,如何排除汉字、中英文标点、空白字符?还需要添加,其实就是正则表达还没学透。后续要继续优化。

    四、结果展示

    有涉及到保密的内容用蓝笔涂抹了

    软件启动,提示用户首先配置CSV(保存料号)的地址。 

    下拉框中针对不同的材料种类进行选择,无需一边查看文档,一边填写。 

     

    一个简单的帮助按钮,用户点击可以获得帮助。  

    点击配置CSV地址按钮,用户需要找到自己公盘的csv文件所在地。 

     

    如果用户点击取消或者没有点击配置csv地址按钮,点击保存料号会弹出警告窗口。 

     

    用户输入了对应的料号,点击生成料号,可以在软件底部预览。 

     

    确认料号无误,点击保存至本地,即可将生成的料号写入csv文件中。 

     

    如果用户未填写内容,点击生成料号按钮会弹出错误窗口。 

    如果用户生成了重复的料号,点击保存按钮会弹出错误窗口。 

     

    这是最终保存在本地的料号展示。 

     五、总结

    这是自己第一次从一个一句话的需求产出一个软件。

    一定要做好开发的规划;

    一定要做好日志文件的记录;

    一定要做好软件版本更迭的记录。

    开发完成后自己可以多测测bug,模拟用户的各种操作(正确的or错误的);

    善用QT官方文档,善用baidu,善用qDebug();

    最后,文件都保存在本地csv,万一有人删除了怎么办?万一有人恶意修改了怎么办?

    后期要解决这个问题。

    Anyway, 每天进步一点点!

     

  • 相关阅读:
    Java项目:SSM医药信息管理系统
    java计算机毕业设计小型企业财务报销管理源码+系统+数据库+lw文档+mybatis+运行部署
    MyBatis 参数传递详解
    2022.8.8-8.14 AI行业周刊(第110期):值钱比赚钱更重要
    若依(ruoyi)之thymeleaf与jsp共存解决方案
    源码解读之FutureTask如何实现最大等待时间
    HCIA网络课程第八周作业
    Springboot启动流程分析(三):刷新IOC容器之执行beanFactory后置处理器原理
    α微管蛋白研究丨SYSY α微管蛋白抗体案例分析
    面向接口编程
  • 原文地址:https://blog.csdn.net/yourgreatfather/article/details/125807684