吐槽一下最近开发 c++ 的经历
最近很忙,没空写东西,今天趁着昨晚的 nightly build 还没完成,写点东西,做个小结。
1. 背景
我平时做大数据开发,用 Linux 环境做开发更顺手。最近项目中要维护 Windows 桌面工具,于是借用了一台 Windows 机器做开发测试 ……
2. 踩坑实录
2.1. Qt
Qt很强大,项目前期都在用qt开发,都可以基本不用stl库的东西。但是开发过程中也有很多我不能理解的坑,估计也是没用熟悉。
2.1.1. 坑1: Model-View-Delegate 模式
用以前开发 Java/.net 等语言的 MVC 或 MVVM 的经验去理解这个模式感觉非常困惑,这个模式的显示界面可以是组件,也可以是qml,但是都有许多很奇怪的特点。
qml还好理解,这里只说组件。组件的view几乎不可控,例如想把表格中某列的数值类型显示成进度条,这里view起不了任何作用,而是通过delegate把渲染好的内容放到界面上……。更有甚者,如果我想让数据有某种作用,我要去修改model,通过model控制显示,why?这不是view应该做的吗??
另外这个模式下面还有一个我至今都没理解清楚的问题,就是 ROLE
究竟是干嘛的。role从字面上看应该是起到了角色的作用,Qt的源码里确实也预定义了一些Role,例如read,edit等。但是包括官网的一些网站上的源码,直接用role当作表格的列用。而qt的源码里,判断Role只有等于EditRole才可以编辑……,这种困惑持续了很长时间,一度认为一个表中只有一列可以修改编辑,直到源码中看到了一个flag方法可以覆写。
另外,感觉Model对基础功能的支持比较弱,想要实现什么功能大部分都要去覆写其中的部分方法。写起来很累……
2.1.2. 坑2: QML
QML在灵活性上比组件好太多了。但是依旧有很多问题:
QML的版本问题,qml很多组件有多个版本,其中一部分并不是修复加强上一个版本的内容,而是完全抛弃上个版本,新建了一个和上个版本名字相同但内容完全不一样的东西。但是有时需要同时用两个版本,这时IDE就开始出各种奇怪问题了。即使加上别名,也是会报各种错误警告。
另外,我不太理解Qml的设计逻辑,最新版本中的表格控件没有了表头,感觉直接可以叫网格控件了。没有表头就意味着原生的表格没有排序功能,没有调整宽度 ……。如果想要以上功能,直接自己去一项一项的写。另外表头要自己拼外框,然后放在表的上方……
如果想用好Qml,团队里必须充足的人力进行界面设计,否则还不如不用。
2.1.3. 放弃继续使用Qt
主要有几方面原因:
- qt的License协议比较复杂,我是没理解太清楚,有可能要开源代码,或者走商业协议
- qml的适配性存疑,在Windows下出现控件边框渲染错乱等问题(或者我没调好?)总之难度较大,人力有限,没空调试
- 我上面提到的各种坑
2.2. Vcpkg
神器,推荐使用。微软维护的开源跨平台(其他平台没试过)管理工具。可以直接编译一些工具。例如GDAL,自己编译即使最小编译也得先编译 sqlite 和 proj,用vcpkg的话基本能实现一句话编译,它自己会下载依赖编译。
Vcpkg 不支持 qt(qmake),只支持Cmake或VC环境
2.2.1. 小缺点
- 下载时使用的网络国内很不友好,必须搭梯子,否则经常超时然后停止编译。
- 编译出来的东西实在太过庞大,必须给vcpkg留下几十个G的使用空间
- 编译速度慢,vcpkg也是下载源码编译,速度可想而知,例如编译GDAL至少需要半天时间
2.3. wxWidgets
现在正在用的界面控件,没有Qt那种可视化的编辑,有点像MFC的编写方式。 这套控件从协议上说,商用没问题,且比Qt轻量级太多。做并不是太复杂的界面问题不大。
3. 一些感想
- Windows 写程序,编译程序真坑。Linux下估计早写完了,但是Windows上不一定能用……
- 核心功能还是用标准库写吧,省的换界面或者换库时得全部重写……
- 继续加油,很头疼