简介:本资源是一个基于Qt5与Qt Creator开发的完整用户认证系统示例,面向C++桌面应用初学者及Qt GUI开发学习者,解决登录界面构建、用户交互逻辑实现与基础安全机制落地等核心问题。项目涵盖登录、注册、修改密码及失败锁定等典型功能模块,采用QWidget传统UI方式,通过信号与槽机制处理用户输入与业务验证,适合用于理解Qt桌面端用户管理系统的设计范式。压缩包共21个文件,含7个.cpp源文件、6个.h头文件、5个.ui界面设计文件,辅以.pro工程配置及.autosave临时文件,总大小仅15KB,结构精简、模块职责清晰,便于逐层阅读与调试。目前已有1516人学习下载,读者可直接导入Qt Creator运行调试,获取完整的界面布局逻辑、用户对象封装(userobject.h/cpp)、多窗口跳转流程(login→main→modify)及密码校验与状态管理的代码实现细节。
1. 用 Qt5 + Qt Creator 快速搭建可运行的登录界面:不是写完就完事,而是从环境校验、UI 布局、信号槽绑定到登录逻辑验证全链路闭环
很多刚接触 Qt 的开发者卡在“界面画出来了,但点登录没反应”这一步——不是代码写错了,而是 Qt5 运行时依赖缺失、Qt Creator 构建套件未正确关联、或者 login 按钮的 clicked() 信号根本没连到处理函数。这个标题里的5_QT_qt5登陆界面_QTcreator_login不是命名规范练习,它直指一个真实开发闭环:必须在 Qt5 环境下,用 Qt Creator 工具链,完成一个具备基础交互能力(输入账号密码 → 触发验证 → 反馈结果)的登录界面。它适合两类人:一是刚装好 Qt Creator、想验证环境是否可用的新手;二是需要快速交付内部工具登录页、拒绝 Web 框架重载的桌面端工程师。关键不在“炫技”,而在“能跑、能调、能改、能上线”。下面所有步骤都基于 Qt5.15.2(LTS 版本)+ Qt Creator 9.x(2023 年主流稳定版)实测路径,不依赖网络认证服务、不引入第三方 UI 库、不修改系统级 Qt 配置,所有操作在项目级 scope 内完成。
2. 用 Qt Creator 新建 Qt Widgets Application 并配置 Qt5 构建套件:确保 moc 和 uic 正常工作,避免 “undefined reference tovtable” 或 “no such file or directory: ui_login.h”
Qt Creator 不是编辑器,它是 Qt 项目的编译调度中心。新建项目时选错模板或构建套件,后续所有 UI 代码都会编译失败。必须严格按以下路径操作,跳过任何“默认下一步”。
2.1 创建项目并锁定 Qt5 Kit
启动 Qt Creator →File → New File or Project→ 左侧选择Application→ 右侧选Qt Widgets Application→ 点击Choose…
- 项目名称填
login_demo(不要用中文或空格) - 路径选纯英文路径,例如
D:\qt_projects\login_demo(Windows)或/home/user/qt_projects/login_demo(Linux) - 点击Next后,在Kit Selection页面,必须手动勾选一个已安装的 Qt5 Kit(如
Desktop Qt 5.15.2 MSVC2019 64-bit或Desktop Qt 5.15.2 GCC 64-bit)。若列表为空,请先通过Tools → Options → Kits → Qt Versions添加 Qt5 安装路径下的qmake.exe(Windows)或qmake(Linux)。
提示:Qt5 Kit 必须包含
qmake、moc、uic三个核心工具。若 Kit 名称含 “Qt6” 或 “CMake” 字样,说明它指向 Qt6 或非 qmake 构建系统,与本标题要求的 Qt5 不兼容,强行使用会导致ui_login.h无法生成、Q_OBJECT宏报错。
2.2 验证构建套件能否生成 UI 头文件
点击Next→ 项目管理页面保持默认 →Finish。Qt Creator 会自动生成mainwindow.ui和mainwindow.cpp。此时不要急着改 UI,先验证基础构建链路:
# 在 Qt Creator 内置终端(Ctrl+Shift+T)中执行: qmake -v # 输出应为 Qt Version 5.15.2(或相近 Qt5.x) # 然后执行: make clean && qmake && make # Linux/macOS 用 make,Windows 用 nmake 或 jom(若配置了 jom)若make报错ui_mainwindow.h: No such file or directory,说明uic未被调用;若报undefined reference to 'vtable for MainWindow',说明moc未处理Q_OBJECT。此时需检查:
.pro文件中是否含QT += widgets(Qt5 必须显式声明)mainwindow.h中类声明前是否有#include <QMainWindow>,类定义内是否有Q_OBJECT宏- Qt CreatorProjects → Build & Run → Build Steps → qmake → Details中,
Additional arguments是否为空(不应加-spec win32-msvc等冗余参数)
2.3 替换主窗口为 Login 界面:删除 MainWindow,新建 LoginDialog 类
Qt 登录界面通常作为模态对话框(QDialog)而非主窗口(QMainWindow),因其无需菜单栏/状态栏,且exec()可阻塞后续逻辑。右键项目名 →Add New…→C++ Class→ 类名填LoginDialog,基类选QDialog,头文件勾选Q_OBJECT。
生成后,修改main.cpp:
#include <QApplication> #include "logindialog.h" // 新增头文件 int main(int argc, char *argv[]) { QApplication a(argc, argv); LoginDialog w; // 实例化 LoginDialog w.show(); // 注意:QDialog 用 show() 即可,非 exec()(避免程序退出) return a.exec(); }同时,删除mainwindow.h/cpp/ui三个文件(右键 → Remove),并在.pro文件中移除对应行(如HEADERS += mainwindow.h)。
注意:
LoginDialog继承QDialog后,其构造函数需显式调用QDialog(parent),并在logindialog.cpp的构造函数中添加setupUi(this)(若后续用 Designer 设计 UI)或直接new控件(代码布局方式)。此步确保项目结构干净,无 Qt5 Kit 冲突残留。
3. 用 Qt Designer 拖拽设计登录界面并生成信号槽:解决 “按钮点了没反应” 的根本原因——信号未连接到槽函数
Qt Designer 是 Qt Creator 内置的可视化 UI 编辑器,它生成.ui文件,经uic编译为ui_xxx.h,再被moc处理。拖拽控件本身不产生逻辑,必须手动建立信号(如QPushButton::clicked())到槽函数(如on_loginButton_clicked())的连接。
3.1 创建 login.ui 并布局核心控件
右键login_demo项目 →Add New…→Qt → Qt Designer Form Class→ 类名LoginDialog,模板选Dialog without Buttons→Next → Finish。
此时生成logindialog.ui、logindialog.h、logindialog.cpp。打开logindialog.ui:
- 从左侧控件栏拖入
QLabel(文本:“用户名:”)、QLineEdit(对象名设为usernameEdit)、QLabel(“密码:”)、QLineEdit(对象名passwordEdit,属性echoMode设为Password)、QPushButton(文本“登录”,对象名loginButton)、QLabel(用于显示提示信息,对象名statusLabel)。 - 使用
Layout工具(水平布局Ctrl+H,垂直布局Ctrl+V)对齐控件,避免绝对定位。最终 UI 应有清晰的输入域和响应区。 - 保存
logindialog.ui。Qt Creator 会自动调用uic生成ui_logindialog.h(位于build-login_demo-Desktop_Qt_5_15_2_MSVC2019_64bit-Debug目录下),该文件定义了Ui::LoginDialog命名空间及setupUi()函数。
3.2 在 LoginDialog 构造函数中调用 setupUi 并初始化 UI 元素
打开logindialog.cpp,修改构造函数:
#include "logindialog.h" #include "ui_logindialog.h" LoginDialog::LoginDialog(QWidget *parent) : QDialog(parent) , ui(new Ui::LoginDialog) { ui->setupUi(this); // 关键:加载 .ui 定义的界面 ui->statusLabel->setText(""); // 初始化状态提示为空 // 设置回车键触发登录(增强体验) ui->passwordEdit->setFocus(); // 密码框默认获得焦点 connect(ui->loginButton, &QPushButton::clicked, this, &LoginDialog::onLoginClicked); connect(ui->passwordEdit, &QLineEdit::returnPressed, this, &LoginDialog::onLoginClicked); }逻辑说明:
ui->setupUi(this)将logindialog.ui中定义的控件实例化并挂载到LoginDialog对象上;connect()手动绑定信号与槽,这是 Qt5 中最可靠的方式(比 Designer 中右键“转到槽”更可控)。returnPressed信号让用户按回车键等效于点击登录按钮,符合桌面应用习惯。
3.3 实现 onLoginClicked 槽函数:做最简登录验证,输出日志并更新 UI
在logindialog.h的private slots:区域添加声明:
private slots: void onLoginClicked();在logindialog.cpp中实现:
#include <QDebug> void LoginDialog::onLoginClicked() { QString username = ui->usernameEdit->text().trimmed(); QString password = ui->passwordEdit->text(); // 最简验证:用户名非空且密码长度 >= 6 if (username.isEmpty()) { ui->statusLabel->setText("错误:用户名不能为空"); ui->usernameEdit->setFocus(); return; } if (password.length() < 6) { ui->statusLabel->setText("错误:密码至少6位"); ui->passwordEdit->setFocus(); return; } // 模拟登录成功(实际项目替换为 HTTP 请求或本地校验) qDebug() << "Login attempt:" << username << "with password length:" << password.length(); ui->statusLabel->setText("登录成功!正在跳转..."); // 此处可 emit signal 或调用 accept() 关闭对话框 // this->accept(); // 若作为模态对话框使用 }参数说明:
trimmed()去除首尾空格,防止用户误输空格导致验证失败;qDebug()输出到 Qt Creator 的Application Output面板,是调试登录逻辑的第一手证据;setFocus()主动将光标移回出错字段,提升用户体验。此函数不依赖任何外部服务,完全离线可运行,验证了 Qt5 UI 事件流的完整性。
4. 编译运行并排查常见 Qt5 登录界面构建失败:聚焦 “login server error” 类错误的真实根源——不是服务器问题,而是本地 Qt 环境或代码链路断裂
网络热词中高频出现的login server error: token exchange failed、failed to start login server等错误,90% 以上并非服务端故障,而是本地 Qt5 项目因环境配置或代码缺陷导致QNetworkAccessManager未初始化、SSL 库缺失、或信号槽未连接,使登录请求根本未发出。本节直击这些错误的本地根因。
4.1 验证 Qt5 网络模块是否启用(若需真实 HTTP 登录)
当前示例为本地验证,但若后续扩展为调用 API,.pro文件必须显式添加:
QT += core widgets network # 若需 HTTPS,还需添加 ssl 模块(Qt5.12+ 默认启用,但某些精简版需手动加) # QT += ssl否则QNetworkAccessManager会编译报错undefined reference to 'QNetworkAccessManager::QNetworkAccessManager(QObject*)'。
提示:Qt5.15.2 Windows MSVC 版本默认包含 OpenSSL 动态库,但需确保
libeay32.dll和ssleay32.dll(或libssl-1_1-x64.dll/libcrypto-1_1-x64.dll)与可执行文件同目录,否则运行时报QSslSocket: cannot resolve SSLv2_client_method,进而导致token exchange failed。解决方案:将 Qt 安装目录5.15.2\msvc2019_64\bin下的 SSL DLL 复制到build-login_demo-...-Debug目录。
4.2 排查 “Q_OBJECT macro required” 和 “no matching function for call to connect” 错误
这两类错误直接导致登录按钮无响应:
Q_OBJECT macro required:说明LoginDialog类未正确继承QObject或遗漏Q_OBJECT。检查logindialog.h:#ifndef LOGINDIALOG_H #define LOGINDIALOG_H #include <QDialog> namespace Ui { class LoginDialog; } class LoginDialog : public QDialog // 必须公有继承 QDialog(QDialog 继承 QObject) { Q_OBJECT // 必须存在,且位于 private: 之前 public: explicit LoginDialog(QWidget *parent = nullptr); ~LoginDialog(); private slots: void onLoginClicked(); // 槽函数声明 private: Ui::LoginDialog *ui; }; #endif // LOGINDIALOG_Hno matching function for call to connect:多因信号/槽签名不匹配。例如connect(ui->loginButton, &QPushButton::clicked, this, &LoginDialog::onLoginClicked)中,若onLoginClicked声明为void onLoginClicked(int)(带参数),则编译失败。Qt5 的新语法&Class::slot要求签名严格一致。
4.3 解决 Qt Creator 终端无法输入密码的问题(login incorrect 密码无法输入)
热词login incorrect 密码无法输入常见于 Qt Creator 内置终端(Application Output)中QLineEdit的echoMode失效。这不是 Qt5 Bug,而是终端模拟器限制:GUI 应用的QLineEdit无法在纯文本终端中安全回显密码。正确做法是忽略终端输入,专注 GUI 界面:
- 确保
ui->passwordEdit->setEchoMode(QLineEdit::Password)在 UI 设计器中已设置(或代码中调用); - 若需调试密码值,用
qDebug() << "Password:" << password;输出明文(仅开发阶段); - 生产环境密码绝不打印,应使用
QCryptographicHash加密后再传输。
| 错误现象 | 根本原因 | 本地验证命令 | 修复动作 |
|---|---|---|---|
undefined reference to 'vtable for LoginDialog' | Q_OBJECT宏缺失或 moc 未运行 | find . -name "moc_logindialog.cpp"检查是否生成 | 清理构建目录,重新 qmake |
ui_logindialog.h: No such file or directory | uic 未执行或 .pro 文件未包含 FORMS | qmake -query QT_INSTALL_BINS确认 uic 路径 | 检查 Kit 中 Qt Version 是否指向 Qt5 |
QSslSocket: cannot resolve SSLv2_client_method | OpenSSL DLL 未找到 | ldd login_demo.exe | grep ssl(Linux)或Dependency Walker(Windows) | 复制 Qt bin 目录下 SSL DLL 到可执行目录 |
LoginDialog::onLoginClicked is not a member of LoginDialog | 槽函数未在头文件声明 | grep -r "onLoginClicked" *.h | 在logindialog.h的private slots:下添加声明 |
5. 为登录界面添加输入校验与国际化支持:用 QRegExpValidator 限制用户名格式,用 Qt Linguist 实现中英双语切换
登录界面不止是“能点”,更要“防错”和“适配多语言”。Qt5 原生提供QRegExpValidator(正则校验)和QTranslator(国际化),无需第三方库,且与 Qt Creator 深度集成。
5.1 用正则表达式校验用户名:只允许字母、数字、下划线,长度 3-20 位
在logindialog.cpp构造函数中,ui->setupUi(this)后添加:
// 为用户名输入框添加正则校验 QRegExp usernameRegex("^[a-zA-Z0-9_]{3,20}$"); QRegExpValidator *usernameValidator = new QRegExpValidator(usernameRegex, this); ui->usernameEdit->setValidator(usernameValidator);逻辑说明:
^[a-zA-Z0-9_]{3,20}$表示字符串开头(^)到结尾($)必须由 3-20 个字母、数字或下划线组成;QRegExpValidator绑定到QLineEdit后,用户输入非法字符时自动被拦截,光标无法停留。此校验在 UI 层实时生效,比点击登录后弹窗提示更友好。
5.2 配置 Qt Linguist 实现中英切换:生成 .ts 文件并加载翻译
Qt 国际化流程为:标记可翻译字符串 → 生成 .ts(文本源)文件 → 用 Linguist 翻译 → 编译为 .qm(二进制)文件 → 运行时加载。
第一步:标记字符串
在logindialog.cpp的onLoginClicked()中,将硬编码字符串改为tr():
if (username.isEmpty()) { ui->statusLabel->setText(tr("Error: Username cannot be empty")); // ... }在logindialog.ui中,所有QLabel、QPushButton的text属性右键 →Change Dynamic Property→ 勾选translatable(Qt Creator 自动处理)。
第二步:生成 .ts 文件
在.pro文件末尾添加:
TRANSLATIONS = login_demo_zh.ts \ login_demo_en.ts然后在 Qt CreatorProjects → Build & Run → Build Steps → Make → Details中,点击Add Build Step → Make,在Make arguments中填release,再添加新步骤:
- Command:
lupdate - Arguments:
-no-obsolete -locations relative -ts $$PWD/login_demo_zh.ts $$PWD/login_demo_en.ts
运行此步骤,生成两个.ts文件。
第三步:用 Linguist 翻译
Qt Creator 自带 Linguist(Tools → External → Linguist),打开login_demo_zh.ts,为每条source填写translation(如Error: Username cannot be empty→错误:用户名不能为空),保存后,Qt Creator 会自动编译为login_demo_zh.qm。
第四步:代码中加载翻译
修改main.cpp:
#include <QApplication> #include <QTranslator> #include "logindialog.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); // 加载中文翻译(根据系统语言自动切换) QTranslator translator; translator.load(":/translations/login_demo_zh.qm"); // 资源路径需先添加到 .qrc a.installTranslator(&translator); LoginDialog w; w.show(); return a.exec(); }注意:
.qm文件需通过 Qt Resource System(.qrc文件)嵌入可执行文件,否则load()失败。右键项目 →Add New… → Qt → Qt Resource File,添加translations目录,导入.qm文件,路径即为:/translations/xxx.qm。
5.3 验证国际化效果:强制切换语言并观察 UI 文本变化
在LoginDialog构造函数中添加临时切换按钮(仅调试用):
// 添加语言切换按钮(调试用) QPushButton *langBtn = new QPushButton("切换语言", this); langBtn->move(10, 10); connect(langBtn, &QPushButton::clicked, [=]() { static bool isZh = true; QCoreApplication::removeTranslator(&translator); if (isZh) { translator.load(":/translations/login_demo_en.qm"); } else { translator.load(":/translations/login_demo_zh.qm"); } QCoreApplication::installTranslator(&translator); isZh = !isZh; });运行后点击按钮,UI 文本实时切换,证明国际化链路完整。生产环境应移除此按钮,改用系统语言检测(QLocale::system().name())自动加载对应.qm。
本文还有配套的精品资源,点击获取