目录

吐槽一下最近开发 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

主要有几方面原因:

  1. qt的License协议比较复杂,我是没理解太清楚,有可能要开源代码,或者走商业协议
  2. qml的适配性存疑,在Windows下出现控件边框渲染错乱等问题(或者我没调好?)总之难度较大,人力有限,没空调试
  3. 我上面提到的各种坑

2.2. Vcpkg

神器,推荐使用。微软维护的开源跨平台(其他平台没试过)管理工具。可以直接编译一些工具。例如GDAL,自己编译即使最小编译也得先编译 sqlite 和 proj,用vcpkg的话基本能实现一句话编译,它自己会下载依赖编译。

Vcpkg 不支持 qt(qmake),只支持Cmake或VC环境

2.2.1. 小缺点

  1. 下载时使用的网络国内很不友好,必须搭梯子,否则经常超时然后停止编译。
  2. 编译出来的东西实在太过庞大,必须给vcpkg留下几十个G的使用空间
  3. 编译速度慢,vcpkg也是下载源码编译,速度可想而知,例如编译GDAL至少需要半天时间

2.3. wxWidgets

现在正在用的界面控件,没有Qt那种可视化的编辑,有点像MFC的编写方式。 这套控件从协议上说,商用没问题,且比Qt轻量级太多。做并不是太复杂的界面问题不大。

3. 一些感想

  1. Windows 写程序,编译程序真坑。Linux下估计早写完了,但是Windows上不一定能用……
  2. 核心功能还是用标准库写吧,省的换界面或者换库时得全部重写……
  3. 继续加油,很头疼