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

news2025/2/25 11:28:01

项目背景

背景

工具多,需要频繁切换。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方式管理数据
  • ……

效果图

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【linux】查看Debian应用程序图标对应的可执行命令

在Debian系统中,应用程序图标通常与.desktop文件关联。您可以通过查看.desktop文件来找到对应的可执行命令。这些文件通常位于/usr/share/applications/或~/.local/share/applications/目录下。这里是如何查找的步骤: 1. 打开文件管理器或终端。 2. 导…

linux下485通信调试记录

1、使用linux下使用串口调试助手 linux下可以安装并使用下述串口调试工具进行串口测试: 1.1、cutecom cutecom是linux下常用的图形化串口调试软件,通过以下命令安装并打开: sudo apt-get install cutecom sudo cutecom显示如下&#xff1…

DAY01_Spring—Spring框架介绍IOCSpring工厂模式

目录 1 什么是框架2 Spring框架2.1 Spring介绍2.2 MVC模型说明2.3 IOC思想2.3.1 问题说明2.3.2 IOC说明 3 Spring IOC具体实现3.1 环境准备3.1.1 关于JDK说明3.1.2 检查JDK环境配置 3.2 创建项目3.3 关于Maven 命令3.3.1 install 命令3.3.2 clean 命令 3.4 添加jar包文件3.4.1 …

经典网络 循环神经网络(一) | RNN结构解析,代码实现

文章目录 1 提出背景2 RNN2.1 RNN结构2.2 RNN代码实现2.3 代码简洁实现 1 提出背景 为什么要引入RNN呢? 非常简单,之前我们的卷积神经网络CNN,全连接神经网络等都是单个神经元计算 但在序列模型中,前一个神经元往往对后面一个神…

Fpga开发笔记(二):高云FPGA发开发软件Gowin和高云fpga基本开发过程

若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/135620590 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

36V/1.6A两通道H桥驱动芯片-SS8812T可替代DRV8812

由工采网代理的SS8812T是一款双通道H桥电流控制电机驱动器;每个 H 桥可提供输出电流 1.6A,可驱动两个刷式直流电机,或者一个双极步进电机,或者螺线管或者其它感性负载;双极步进电机可以以整步、2 细分、4 细分运行&…

旧路由重置新路由设置新路由设置教程|适用于自动获取IP模式

前言 如果你的光猫是直接拨号(路由模式)的,就可以按照本教程进行路由重置或者更换新路由器。 本文章适合电脑小白,请注意每一步哦! 注意事项 开始之前需要确认光猫是桥接模式还是路由模式。如果光猫是路由模式&…

❤ HbuildX使用以及快捷键

❤ HbuildX使用以及快捷键 一、HbuildX使用 HbuildX左侧项目侧边栏 点击视图 > 显示项目左侧即可 二、HBuilder X 快捷键 左移 Shift tab 右移 tab 查找 全局文件搜索:CtrlP 本文档内查找字符串:ctrlf 目录内查找字符串:ctrlaltf 替换:ctrlh 查找下一个字符串:f3 查…

表的增删改查CURD(一)

🎥 个人主页:Dikz12🔥个人专栏:MySql📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 新增(Create) 全列插入 指定列…

SDK游戏盾是什么?,sdk游戏盾有什么作用

在现今的游戏市场,游戏保护成为了每个游戏开发者都不能忽视的重要环节。恶意破解、作弊和盗版等问题严重影响了游戏的安全性和商业价值。而如何保护自己的游戏免受这些威胁,已经成为游戏开发者们面临的重大挑战。好在SDK游戏盾,它如同保护游戏…

家用小型洗衣机哪款性价比高?好用的内衣洗衣机推荐

现在大多数的上班族,面临的都是早九晚六的工作,而且工作完下班回家还是面对各种各样的家务,特别是清洗需要换洗的洗衣,属实是有点辛苦了。可能很多人为了方便,每次洗衣服的都是把一堆衣服直接丢进洗衣机,直…

Ansible Filter滤波器的使用(一)

一、【说在前面】 Ansible Filter一般被称为滤波器或者叫过滤器。 这个东西初次听到以为是什么科学计算的东西,但是想来ansible不太可能有什么滤波操作,所以这个东西本质是一个数值筛选器,内置函数,本质是一个为了做区别化的工具…

光学 | 联合Ansys Zemax及Lumerical应对AR/VR市场挑战

当前的增强现实和虚拟现实(AR/VR)市场涵盖了广泛的应用趋势,设计人员和各企业在努力寻找非传统解决方案,以满足主流消费者不断变化的需求。 对于AR头戴设备等可穿戴解决方案,设计思路通常源于对小巧轻量化系统的需求&a…

大数据传输慢的真正原因与解决方案

随着企业数据不断增长,大数据传输已成为一项至关重要的任务。然而,许多企业在处理大数据传输时频繁遭遇传输速度慢的问题。本文将深入探讨大数据传输速度慢的根本原因,并提供一些切实有效的解决方案。 大数据传输在企业中的重要性不言而喻&am…

算法竞赛备赛进阶之数位DP训练

数位DP的思想就是对每一位进行DP,计算时记忆化每一位可以有的状态,其作用是减少运算时间,避免重复计算。 数位DP是一种计数用的DP,一般就是要统计一个区间[A,B]内满足一些条件数的个数。 以1e9甚至1e18、1e100的问题为例&#x…

Docker 容器之间的互相通信

Docker容器之间的互相通信 步骤一:创建自定义网络 首先,我们需要创建一个自定义网络,以便容器可以连接到这个网络上,从而实现互相通信。在命令行中执行以下命令: # 创建 docker network create ddz # 查看 docker n…

洛谷 P1523 旅行商简化版【线性dp+npc问题简化版】

原题链接:https://www.luogu.com.cn/problem/P1523 题目背景 欧几里德旅行商(Euclidean Traveling Salesman)问题也就是货郎担问题一直是困扰全世界数学家、计算机学家的著名问题。现有的算法都没有办法在确定型机器上在多项式时间内求出最优解,但是有…

2024 年企业要增强反脆弱性,IT 能够做什么?

新冠疫情被称为黑天鹅事件,而“黑天鹅”这个词的创造者纳西姆尼古拉斯塔勒布在另一本书《反脆弱:从不确定性中获益》( CSDN博主读书笔记《反脆弱:从不确定性中获益》 )中,则给出了面对随时可能出现的黑天鹅…

玖章算术NineData通过阿里云PolarDB产品生态集成认证

近日,玖章算术旗下NineData 云原生智能数据管理平台 (V1.0)正式通过了阿里云PolarDB PostgreSQL版 (V11)产品集成认证测试,并获得阿里云颁发的产品生态集成认证。 测试结果表明,玖章算术旗下NineData数据管理平台 (V1.0&#xff…

Python源码23:海龟画图turtle画小狗狗

---------------turtle源码集合--------------- Python教程43:海龟画图turtle画小樱魔法阵 Python教程42:海龟画图turtle画海绵宝宝 Python教程41:海龟画图turtle画蜡笔小新 Python教程40:使用turtle画一只杰瑞 Python教程39…