记一次用Qt开发 “启动器” 的经历

项目背景

背景

工具多,需要频繁切换。Windows环境,因为日常用到的软件较多,大致如下

  • 浏览器涉及3款
    • Firefox
    • Chrome
    • Edge
  • 开发的编译器及IDE涉及
    • Visual Studio
    • Visual Studio Code
    • Pycharm
    • Sublime Text
  • 设备涉及
    • Desktop
    • Mackbook Air
    • Laptop

如此多的软件将任务栏占满,启动时比较麻烦。虽然使用了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

  • 优点:实现简单,对应就这么十几个最多几十个程序,完全能够胜任
  • 缺点:似乎起不到练习技术的目的

经验总结

遇到的问题汇总

  1. 如何实现从桌面向GUI的拖拽,以添加快捷方式
    • 关键在于override dragEnterEvent(),dragMoveEvent(),dropEvent()这3个函数
  2. 如何实现从GUI向桌面/或其他GUI之外的区域拖拽以删除快捷方式
    • 这里其实是耗费了我相当多时间的,分别遇到了
      • QGroupbox生完了mouse event后,仍然无法拖拽其成员的情况
      • 可以拖拽但如何实现拖拽动画效果
      • 如何判断拖拽的位置已经超出gui范围从而从layout中remove掉
    • 这里要理解Qt对于MouseEvent的处理机制,在同一个GUI上,可能存在多层widget,比如在QGroupBox之上放置了QCommandLinkButton,当鼠标点击或拖拽的位置是在button之上,那么会触发button相应的event处理函数,而非其下层的widget
    • 当然也可以通过人为的设置eventFilter()对event进行筛选处理,通过对上层的widget进行installEventFilter(),让它获取到event后不进行处理,而是向下转发,这样就可以通过鼠标对同一位置但不同层的widget进行选择性处理
  3. 如何通过QCommandLinkButton启动程序
    • 可以通过QProcess,但未能启动成功
    • 可以通过QDesktopService,后面采用的是这种
  4. 如何获取快捷方式中的icon
    • 这是个小问题,但确实当时挺头疼,因为尝试了多种方法后仍然无法获取,最后通过QFileIconProvide成功实现

启示

  1. 对于Qt的event的工作原理需要加深了解
  2. 对于Qt中提供的类缺乏全面的了解,遇到问题时不知道该选择哪个类。有些情况Qt已经提供了非常完整的解决方案,但在不知情情况下,容易手动造轮子浪费时间
  3. 想法是简单的,完整的。但工程不论大小,实现起来才会涉及到方方面面的细节,编程真的是个工科活计,就得多动手,否则脑子里想当然的认为很简单,但实现起来就发现根本不是那么一回事,任何一个小节节就可以卡你半天

优化方向

有很多可以优化的方向,只不过暂时不想耗时间在这上面了

  • 实现GridLayout的多列(目前已经实现,中不过拖拽时会出现空白,且不自动rearrange的情况,试着fix,发现需要投入不少时间,暂时未动手)
  • ui效果美化一下
  • 增加任务栏类似功能,程序启动后在gui上显示,通过点击可以实现切换到当前程序。当前仅是简简单单的点击启动
  • 更改为model/view及delegate方式管理数据
  • ……

效果图

(正赶上重装了系统,很多软件还未安装。所以随便添加了一些)
在这里插入图片描述

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值