项目背景
背景
工具多,需要频繁切换。Windows环境,因为日常用到的软件较多,大致如下
- 浏览器涉及3款
- Firefox
- Chrome
- Edge
- 开发的编译器及IDE涉及
- Visual Studio
- Visual Studio Code
- Pycharm
- Sublime Text
- 设备涉及
- DeskTop
- Mackbook Air
- NoteBook
如此多的软件将任务栏占满,启动时比较麻烦。虽然使用了uTools
,但无法直接罗列还是多少有些不顺手。于是想,正在学习Qt,能否顺手用C++结合Qt开发一款简易的Launcher
,将日常要用到的所有软件包含在内,以便快速启动?于是有了本项目。
项目描述
语言及框架
C++ 加 Qt
功能
通过在GUI上分组放置一些程序的快捷方式,允许
- 通过拖拽添加和删除快捷方式
- 通过点击可直接启动相应的程序
- 可以在退出时自动保存数据,下次启动时自动加载,从而避免每次都要从头添加
项目难度
当初设想使用Qt及C++开发,基本是简单逻辑+现成API的组合。当时认为难度初级。
事后证明于我而言,还是走了不少弯路,技术上没有太难的地方,对于Qt的工作原理反而耗费了最多的时间。
耗时
每天断断续续的开发,约用了3个自然日。
项目过程
通过什么widget进行展示
我的目的就是要将一些程序的快捷方式,展示到GUI上,通过点击可以启动相应的程序。
QLabel
最简洁,添加icon及text即可。某种程度上讲,这属于人为组装的快捷方式,最终未采用。
QCommandLinkButton
Qt官方封装的快捷方式。如果从技术练习和使用的角度,这个是更好的选择。也是最终我的选择。
选择如何展示
其实本质就是在GUI上添加一些程序icon,通过点击,可以启动相应的程序。如何展示这些icon呢?当时想到了几下不同的方案。
model/view结构
- 优点:数据添加及修改都较灵活。也是Qt本身比较应对较大数据量时推荐的数据展示方式
- 缺点:就这么一个小小的项目,好像有点搞复杂了
groupbox/layout
- 优点:实现简单,对应就这么十几个最多几十个程序,完全能够胜任
- 缺点:似乎起不到练习技术的目的
经验总结
遇到的问题汇总
- 如何实现从桌面向GUI的拖拽,以添加快捷方式
- 关键在于override
dragEnterEvent()
,dragMoveEvent()
,dropEvent()
这3个函数
- 关键在于override
- 如何实现从GUI向桌面/或其他GUI之外的区域拖拽以删除快捷方式
- 这里其实是耗费了我相当多时间的,分别遇到了
- 对
QGroupbox
生完了mouse event后,仍然无法拖拽其成员的情况 - 可以拖拽但如何实现拖拽动画效果
- 如何判断拖拽的位置已经超出gui范围从而从layout中remove掉
- 对
- 这里要理解Qt对于MouseEvent的处理机制,在同一个GUI上,可能存在多层widget,比如在
QGroupBox
之上放置了QCommandLinkButton
,当鼠标点击或拖拽的位置是在button之上,那么会触发button相应的event处理函数,而非其下层的widget - 当然也可以通过人为的设置
eventFilter()
对event进行筛选处理,通过对上层的widget进行installEventFilter()
,让它获取到event后不进行处理,而是向下转发,这样就可以通过鼠标对同一位置但不同层的widget进行选择性处理
- 这里其实是耗费了我相当多时间的,分别遇到了
- 如何通过QCommandLinkButton启动程序
- 可以通过
QProcess
,但未能启动成功 - 可以通过
QDesktopService
,后面采用的是这种
- 可以通过
- 如何获取快捷方式中的icon
- 这是个小问题,但确实当时挺头疼,因为尝试了多种方法后仍然无法获取,最后通过
QFileIconProvide
成功实现
- 这是个小问题,但确实当时挺头疼,因为尝试了多种方法后仍然无法获取,最后通过
启示
- 对于Qt的event的工作原理需要加深了解
- 对于Qt中提供的类缺乏全面的了解,遇到问题时不知道该选择哪个类。有些情况Qt已经提供了非常完整的解决方案,但在不知情情况下,容易手动造轮子浪费时间
- 想法是简单的,完整的。但工程不论大小,实现起来才会涉及到方方面面的细节,编程真的是个工科活计,就得多动手,否则脑子里想当然的认为很简单,但实现起来就发现根本不是那么一回事,任何一个小节节就可以卡你半天
优化方向
有很多可以优化的方向,只不过暂时不想耗时间在这上面了
- 实现GridLayout的多列(目前已经实现,中不过拖拽时会出现空白,且不自动rearrange的情况,试着fix,发现需要投入不少时间,暂时未动手)
- ui效果美化一下
- 增加任务栏类似功能,程序启动后在gui上显示,通过点击可以实现切换到当前程序。当前仅是简简单单的点击启动
- 更改为model/view及delegate方式管理数据
- ……
效果图
(正赶上重装了系统,很多软件还未安装。所以随便添加了一些)