前言
作为一个经常被各种待办事项淹没的人,我试过不少待办管理工具,但总觉得少了点什么——要么界面太复杂,要么功能不够贴合自己的习惯。于是我想:不如自己写一个?
但我此前并没有开发过桌面应用。好在现在有了 AI 辅助编程工具,我决定尝试用 AI 帮我从零开始构建一款待办管理桌面应用。整个过程历时不算长,最终产出了一个功能完善、界面现代的应用。这篇文章记录了我的开发过程、AI 协作经验,以及踩过的一些坑。
项目介绍
Easy Todo 是一款基于 Python 的本地待办事项管理桌面应用,采用微软 Fluent Design 设计风格。
核心功能
-
多视图导航:全部任务、今日任务、重要任务、已完成四个页面
-
任务属性:优先级(无/低/中/高)、颜色标签(9 种)、截止日期、自动延期
-
浮窗模式:无边框半透明浮窗,可拖动、可调整大小,支持固定位置和快速新建任务
-
主题系统:浅色/深色/跟随系统三种模式,运行时实时切换
-
系统集成:系统托盘、开机自启、窗口状态记忆
-
数据管理:JSON 导入导出,智能合并策略
AI 协作开发经验
我的工作流
整个开发过程,我基本遵循这样的循环:
描述需求 → AI 生成代码 → 人工审核 → 运行测试 → 发现问题 → 描述问题 → AI 修复 → 循环
先让AI根据plan计划生成一个完整的项目,然后审查项目是否有问题,再让AI逐步完善细节和修复问题。
AI 擅长什么
样板代码生成:像数据库模型定义、CRUD 操作、设置页面的表单控件这类有固定模式的工作,AI 生成得又快又准。
UI 布局搭建:描述清楚布局需求("标题栏在上方,左边是标签,右边是按钮"),AI 能快速生成对应的 QVBoxLayout、QHBoxLayout 代码。
样式调整:告诉 AI "按钮要圆角 8px,hover 时背景色变深",它能直接写出样式代码。
重复性修改:比如"给所有视图都加上这个功能",AI 能准确找到所有需要修改的文件。
AI 不擅长什么
整体架构设计:AI 倾向于把所有代码塞进一个文件,需要人工引导它拆分模块、建立清晰的分层结构。
主题一致性:AI 经常在新增组件时忘记处理深色/浅色主题适配,导致切换主题后样式丢失。比如我在开发浮窗时,多次遇到主题切换后背景颜色不对的问题。
边界情况:AI 生成的代码通常只覆盖正常流程,异常处理往往不够。比如 PushButton 只传图标不传文本会报错,AI 最初并没有考虑到。
上下文遗忘:随着对话变长,AI 会"忘记"之前的约定。比如前面已经约定了用 QLabel 做按钮,后面新增按钮时它又用了 ToolButton,导致样式不一致。
实用技巧
-
需求要具体:不要说"加个过滤功能",要说"在 toolbar 左侧加一个下拉框,选项为全部/低/中/高优先级,选择后过滤列表"
-
分步实现:复杂功能拆成多个小步骤,每步验证后再进行下一步
-
及时回退:AI 的方案不对时,直接要求回退,不要在错误方向上反复修补
-
保持代码风格一致:明确告诉 AI 用什么方式实现(比如"用 QLabel 做按钮,不要用 ToolButton")
踩坑与解决方案
开发过程中遇到了不少问题,这里记录几个比较有代表性的。
坑 1:浮窗随主窗口最小化消失
最初浮窗使用 Qt.WindowType.Tool 窗口标志,这是 Qt 中"工具窗口"的标准做法。但发现主窗口最小化时,浮窗也跟着消失了。
原因:Tool 类型的窗口在 Qt 中被视为父窗口的附属窗口,父窗口最小化时会自动隐藏。
解决:改用 Window | WindowDoesNotAcceptFocus,让浮窗成为独立窗口,同时不抢占焦点。
坑 2:PySide6 中 SkipTaskbarHint 不存在
为了让浮窗不在任务栏显示,我尝试添加 SkipTaskbarHint 标志,结果直接报 AttributeError。
原因:PySide6 中这个标志的名称和 PyQt5 不同,或者在某些版本中不可用。
解决:使用 WindowDoesNotAcceptFocus 替代,效果类似。
坑 3:主题切换后划线样式丢失
切换深色/浅色主题后,已完成任务的删除线(text-decoration: line-through)消失了。
原因:主题切换时只刷新了浮窗样式,没有刷新卡片组件的样式。
解决:在主题切换回调中增加 _refresh_all_views() 调用,重新加载所有视图的卡片。
坑 4:浮窗固定恢复时主题不对
浮窗固定后关闭应用再重启,恢复的浮窗背景颜色与当前主题不符。
原因:浮窗初始化(_setup_floating)在主题设置(_apply_initial_theme)之前执行,浮窗创建时主题还没应用。
解决:将浮窗恢复逻辑延迟到主题应用之后,先标记 pending,主题设置完成后再显示浮窗并刷新样式。
坑 5:PushButton 只传图标报错
尝试用 PushButton(FluentIcon.CLOSE) 创建一个只有图标的按钮,结果报 TypeError: missing 1 required positional argument: 'text'。
原因:QFluentWidgets 的 PushButton 要求必须传入 text 参数。
解决:改用 ToolButton 或 TransparentToolButton,它们支持只传图标。
总结与反思
这个项目从零到完成,AI 辅助编程确实大幅提升了开发效率。粗略估计,如果没有 AI,同样的功能可能需要多花 2-3 倍的时间。特别是在 UI 布局、样式调整、样板代码这些方面,AI 的效率优势非常明显。
但 AI 编程也不是"躺平就能出活"。它更像是一个效率极高的初级开发者——执行力强,但需要你明确方向、把控质量。你需要:
-
当好架构师:负责整体设计和模块划分
-
当好 code reviewer:审核 AI 生成的每一行代码
-
当好测试工程师:发现边界情况和样式不一致
-
当好产品经理:明确需求,及时纠偏
总的来说,AI 辅助编程让我这样一个没有桌面软件开发经验的也能在短时间内做出一个功能完善、界面现代的应用。它降低了开发的门槛,但并没有降低对开发者的要求——你仍然需要理解代码、发现问题、做出决策。
项目源码:Easy Todo
这里还没有评论哦
快来发一条评论抢占前排吧