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

项目背景

背景

工具多,需要频繁切换。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

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

经验总结

遇到的问题汇总

  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方式管理数据
  • ……

效果图

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/326862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【模板规范】会议纪要模板

文章目录 1、简介2、纪要模板2.1、表格类会议纪要2.2、文档类会议纪要2.3、简易版项目纪要 3、会议纪要3.1、作用3.2、特点3.2.1、工作会议纪要3.2.2、代表会议纪要3.2.3、座谈会议纪要3.2.4、联席会议纪要3.2.5、办公会议纪要3.2.6、汇报会议纪要3.2.7、技术鉴定会议纪要 3.3、…

NVMe系统内存结构 - SGL

NVMe系统内存结构 - SGL 1 SGL简介2 SGL Segment3 SGL Descriptor3.1 SGL Data Block descriptor3.2 SGL Bit Bucket descriptor3.3 SGL Segment descriptor3.4 SGL Last Segment descriptor 4 SGL组织结构4.1 SGL1为SGL Data Block descriptor4.2 SGL1为SGL Last Segment desc…

【每日一题】2719. 统计整数数目-2024.1.16

题目; 2719. 统计整数数目 给你两个数字字符串 num1 和 num2 &#xff0c;以及两个整数 max_sum 和 min_sum 。如果一个整数 x 满足以下条件&#xff0c;我们称它是一个好整数&#xff1a; num1 < x < num2min_sum < digit_sum(x) < max_sum. 请你返回好整数的…

解决Windows 10/11不能连接WiFi的几种办法,可以尝试

没有什么事情比电脑无法连接到互联网更令人沮丧了。当你的Windows 10/11电脑无法连接到网络时,本文将帮助你完成一些修复。 为什么我不能连接到网络 无线网络是复杂的,因为有几个故障点。从Wi-Fi交换机到软件冲突、路由器问题和ISP问题,找出网络故障可能很困难。 Windows…

兴达易控EtherCAT转Profibus网关让工业自动化变得轻松快捷

EtherCAT转Profibus网关&#xff08;XD-ECPBM20&#xff09;是一种用于实现不同通信协议间互联互通的设备。它主要用于工业控制系统中&#xff0c;能够将EtherCAT总线的数据传输转换为Profibus网络可接受的格式。这样的网关设备在工业自动化领域有着广泛的应用&#xff0c;因为…

zds1104示波器使用指南

1、设置语言 2、功能检测验证示波器是否正常工作 3、示波器面板按钮详解 3.1、软键 3.2、运行控制与操作区 3.3、水平控制区 3.4、垂直控制区 3.5、多功能控制区 3.6、断电启动恢复&#xff0c;auto setup&#xff0c;default setup&#xff0c;恢复出厂设置详细解释 3.7、触…

UE5 RPG AttributeSet的设置

AttributeSet 负责定义和持有属性并且管理属性的变化。开发者可以子类化UAttributeSet。在OwnerActor的构造方法中创建的AttributeSet将会自动注册到ASC。这一步必须在C中完成。 Attributes 是由 FGameplayAttributeData定义的浮点值。 Attributes能够表达从角色的生命值到角色…

基于ArcGIS的晕线制作

在借助ArcGIS进行制图时&#xff0c;我们有时需要为矢量边界添加晕线&#xff0c;今天就来探索一下基于ArcGIS的晕线制作操作。 软件版本&#xff1a;ArcMap10.4.1 方法一&#xff1a;制作多环缓冲区 工具路径&#xff1a;Analysis Tools-Proximity-Mutiple Ring Buffer 思…

SUKER书客重磅发布全新系列:书客Sun立式护眼台灯,护眼养眼新境界

近日&#xff0c;国内知名的光学国货品牌——SUKER书客在2024年新品发布上&#xff0c;正式发布了全新系列的书客Sun立式护眼台灯。 SUKER书客作为近年来快速发展的创新型光学技术品牌&#xff0c;曾推出的一系列产品都取得了刷新行业标准的成绩&#xff0c;他们坚持以创新为动…

Flink启动Yarn Session报错:Couldn‘t deploy Yarn session cluster

Flink版本&#xff1a;1.1.3 启动Yarn Session的语句&#xff1a;bin/yarn-session.sh -nm test -d 报错截图如下&#xff1a; 仅通过ERROR信息只能知道是yarn session集群未能正常启动&#xff0c;因此继续向下查找&#xff1a; 找到报错信息的Caused by部分&#xff1a; 报…

[ PyQt入门教程 ] Qt Designer工具的使用

Qt Designer是PyQt程序UI界面的实现工具&#xff0c;使用Qt Designer可以拖拽、点击完成GUI界面设计&#xff0c;并且设计完成的.ui程序可以转换成.py文件供python程序调用。本文主要通过用户登录需求描述Qt Designer工具开发界面的使用方法。 主要内容 1、Qt Designer程序主界…

WEB 3D技术 three.js 3D贺卡(2) 加入天空与水面效果

上文 WEB 3D技术 three.js 3D贺卡(1) 搭建基本项目环境 我们简单搭了一个贺卡雏形 然后 我们要引入一个hdr的一个天空的效果 所以 我们需要在代码中导入 RGBELoader //导入 RGBELoader hdr工具 import { RGBELoader } from "three/examples/jsm/loaders/RGBELoader"…

C++多线程学习[四]:多线程的通信和同步、互斥锁、超时锁、共享锁

一、多线程的状态 初始化 &#xff08;Init&#xff09;&#xff1a;该线程正在被创建。就绪 &#xff08;Ready&#xff09;&#xff1a;该线程在就绪列表中&#xff0c;等待CPU的调度。运行 &#xff08;Running&#xff09;&#xff1a;该线程正在运行。阻塞&#xff08;Bl…

用 25,000 颗星撬动一个向量数据库的世界

25,000 颗星是什么&#xff1f;是 GitHub 上对于一个数据库项目的极高认可&#xff0c;是 10,000 社区用户的共同协作&#xff0c;也是 5000 企业级用户的信赖与支持。 Milvus 用这 25,000 颗星撬动了向量数据库的世界&#xff0c;在 AGI 浪潮奔涌而来的时代&#xff0c;向全球…

Linux 内核被冬季风暴 “封印“

Linus Torvalds在内核邮件列表上宣布&#xff0c;由于他所在的美国俄勒冈州波特兰地区受到严重冬季风暴的影响&#xff0c;导致网络和电力中断。波特兰及其周边地区气温急降至零下 -10C&#xff0c;因此他不得不临时中断对Linux 6.8内核的合并窗口操作。 Linus于1月7日发布了Li…

智谱AI技术开放日:新一代基座大模型GLM-4及GLMs的发布

2024年1月16日&#xff0c;智谱AI举行了一次重要的技术开放日&#xff0c;发布了新一代基座大模型GLM-4和定制化的大模型GLMs。此次发布标志着智谱AI在人工智能领域的新一轮突破&#xff0c;进一步提升了大模型的性能&#xff0c;并降低了使用门槛&#xff0c;使得更多的人能够…

HCIP -- 第六天作业

要求&#xff1a; 实现&#xff1a; 3路由策略干涉选路&#xff1a;[R3]ip ip-prefix c permit 13.1.1.0 24 抓住13网段 [R3]route-policy c permit node 10 创建路由策略为C 序号为10 [R3-route-policy]if-match ip-prefix c 匹配路由策略c [R3-route-policy]apply cost-type…

《深入分析Linux内核源代码》读后感 --所有的进程都使用相同的逻辑地址空间,那么不同的进程是如何区分自己的数据段和代码段的呢

书中讲到从2.2版开始&#xff0c;Linux让所有的进程&#xff08;或叫任务&#xff09;都使用相同的逻辑地址空间&#xff0c;每个进程的逻辑地址空间范围为0&#xff5e;4GB&#xff0c;而且段基址也一样。那么不同的进程是如何区分自己的数据段和代码段的呢。看到另外一篇博文…

FFmpeg之AVFormat

文章目录 一、概述二、解封装流程三、重要结构体3.1、AVFormatContext3.2、AVInputFormat3.3、AVOutputFormat3.4、AVStream 四、重要函数分析4.1、avformat_alloc_context4.2、avformat_open_input4.2.1、init_input4.2.2、av_probe_input_format2 4.3、avformat_find_stream_…

RAG基础功能优化、以及RAG架构优化

RAG基础功能优化 对RAG的基础功能优化&#xff0c;我们要从RAG的流程入手[1]&#xff0c;可以在每个阶段做相应的场景优化。 从RAG的工作流程看&#xff0c;能优化的模块有&#xff1a;文档块切分、文本嵌入模型、提示工程优化、大模型迭代。下面针对每个模块分别做说明&#…