Thinking in Qt —— 项目开发最佳实践(二)

最近有位淘宝客户来找我,想在他的软件打开之前加个登录

做完之后我突然意识到:

这不是一个“客户需求”,而是所有 Qt 初学者都绕不开的一个功能

今天我带大家一起用 Qt/C++ 来开发 结构清晰、可复用、风格现代 的 登录窗口

先看完成后的 demo

代码下载 https://thinkinginqt.com/20251121_thinkinginqt/logindialog.zip

一、为什么要为登录设计“专业架构”?

很多同学第一次做登录功能时,代码一般是这样的:

但正确的做法应该像这样:

✔ UI 负责采集输入(LoginDialog)

✔ AuthService 负责校验业务(AuthService)

✔ main.cpp 负责流程控制(程序入口)

✔ MainWindow 不知道登录发生过什么(职责单一)

这种写法才是“Qt 项目开发最佳实践”。


二、先看最终 Demo 的结构

整个项目非常干净:

其中最关键的结构是:


三、AuthService —— 专职处理“验证”的服务类

这个类非常关键,它让整个项目变得“专业”:

✓ LoginDialog 不需要知道数据库如何验证

它只负责把用户名和密码交给 AuthService。

✓ 将来要换成 HTTP 登录、LDAP 登录、Token 登录,只改 AuthService

UI 完全不用改。

✓ 遵循 Qt 项目最重要的原则:职责清晰


四、LoginDialog —— 一个“纯输入”的对话框

LoginDialog 会在用户按下回车或点击按钮时发起验证:

这里有两个最佳实践:


① 登录成功用 accept(),不是自己去 new MainWindow


② Enter 键行为智能化

专业软件的“登录体验”就是这么做的。


五、main.cpp —— 最优雅、最干净的流程控制方式

这是 Qt 最推荐的登录流程写法:


① 数据库连接写在 main.cpp,而不是 UI 里

因为:


② 登录失败 → 不进入主窗口,直接退出

这是绝大多数管理软件的标准行为。


③ 程序的流程自然清晰

  1. 启动

  2. 打开数据库

  3. 显示 LoginDialog

  4. 登录成功 → 进入主界面

  5. 登录失败 / 取消 → 退出

整个流程都写在 main.cpp,任何人看到都懂,不用翻文件


六、MainWindow —— 职责极其简单

MainWindow 只负责:

它不负责: