这是登录的代码 :#include "qlineedit.h"
#include <QMessageBox>
#include <QSettings> // 用于读写配置文件(INI格式)
#include "loginwindow.h"
#include "ui_loginwindow.h"
#include "userinfodialog.h" // 用户信息完善对话框
#include "myuserinfodialog.h"
// 构造函数:初始化UI和成员变量
LoginWindow::LoginWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::LoginWindow)
{
ui->setupUi(this); // 设置UI界面
registerWindow = nullptr; // 初始化注册窗口指针
this->setWindowTitle("登录"); // 设置窗口标题
loadUserData(); // 加载用户数据
}
// 析构函数:释放资源
LoginWindow::~LoginWindow()
{
delete ui; // 删除UI
if(registerWindow)
delete registerWindow; // 删除注册窗口(如果存在)
}
// 从配置文件加载用户数据到内存
void LoginWindow::loadUserData()
{
QSettings settings("login_data.ini", QSettings::IniFormat); // 打开配置文件
settings.beginGroup("Users"); // 进入Users分组
userData.clear(); // 清空内存数据
foreach (const QString &key, settings.allKeys()) {
userData.insert(key, settings.value(key).toString()); // 加载所有用户数据
}
settings.endGroup(); // 结束分组
qDebug() << "当前用户数据:" << userData; // 调试输出
}
// 窗口显示事件:每次显示窗口时刷新数据
void LoginWindow::showEvent(QShowEvent *event)
{
QMainWindow::showEvent(event); // 调用父类事件
loadUserData(); // 重新加载数据
}
// 登录按钮点击事件
void LoginWindow::on_pushButton_Login_clicked() {
QString inputUser = ui->lineEdit_Account->text().trimmed();
QString inputPass = ui->lineEdit_Password->text().trimmed();
if (inputUser.isEmpty() || inputPass.isEmpty()) {
QMessageBox::warning(this, "错误", "请输入账号或密码");
return;
}
QSettings settings("login_data.ini", QSettings::IniFormat);
settings.beginGroup("Users");
QStringList users = settings.childKeys();
bool found = false;
for (const QString &user : users) {
if (user == inputUser && settings.value(user).toString() == inputPass) {
found = true;
break;
}
}
settings.endGroup();
if (found) {
QMessageBox::information(this, "成功", "登录成功!");
this->hide();
// === 新增逻辑:检查用户信息是否已完善 ===
QSettings userSettings("user_data.ini", QSettings::IniFormat);
userSettings.beginGroup(inputUser); // 以用户名为分组存储信息
bool hasUserInfo = !userSettings.value("name").toString().isEmpty();
userSettings.endGroup();
if (hasUserInfo) {
// 情况1:信息已完善,直接进入主界面(或跳转到 MyUserInfoDialog)
QMainWindow *mainWindow = new QMainWindow();
mainWindow->show();
this->close();
} else {
// 情况2:信息未完善,打开 UserInfoDialog 并传递用户名
UserInfoDialog *userInfoDialog = new UserInfoDialog(inputUser, this);
userInfoDialog->setAttribute(Qt::WA_DeleteOnClose);
connect(userInfoDialog, &UserInfoDialog::finished, this, [this, inputUser](int result) {
if (result == QDialog::Accepted) {
// 信息保存成功后进入主界面
QMainWindow *mainWindow = new QMainWindow();
mainWindow->show();
this->close();
} else {
// 用户取消操作,返回登录界面
this->show();
}
});
userInfoDialog->show();
}
} else {
QMessageBox::warning(this, "错误", "账号或密码错误");
ui->lineEdit_Password->clear();
}
}
// 密码显示/隐藏切换
void LoginWindow::on_checkBox_ShowPwd_stateChanged(int state)
{
if (state == Qt::Checked) {
ui->lineEdit_Password->setEchoMode(QLineEdit::Normal); // 显示明文
} else {
ui->lineEdit_Password->setEchoMode(QLineEdit::Password); // 显示密文
}
}
// 跳转注册按钮点击事件
void LoginWindow::on_pushButton_Register_clicked()
{
RegisterWindow *regWin = new RegisterWindow(this); // 创建注册窗口
connect(regWin, &RegisterWindow::requestShowLogin, this, [this]() {
this->show(); // 注册完成后显示登录窗口
});
regWin->show(); // 显示注册窗口
}
// 处理注册成功信号(未实际使用,可移除)
void LoginWindow::handleRegisterSuccess(const QString &user, const QString &pass)
{
QSettings settings("MyCompany", "LoginApp"); // 错误:应与注册窗口使用同一配置文件
settings.beginGroup("Users");
settings.setValue(user, pass); // 保存用户数据
settings.sync(); // 强制写入磁盘
settings.endGroup();
loadUserData(); // 刷新内存数据
qDebug() << "注册成功并保存:" << user << pass;
}
// LoginWindow 中打开 UserInfoDialog 的代码
// LoginWindow::onLoginSuccess 中处理新用户保存后的跳转
void LoginWindow::onLoginSuccess(const QString &username) {
QSettings settings("user_data.ini", QSettings::IniFormat);
settings.beginGroup(username);
bool hasInfo = !settings.value("name").toString().isEmpty();
settings.endGroup();
if (hasInfo) {
// 已保存信息:直接跳转到 MyUserInfoDialog
MyUserInfoDialog *dialog = new MyUserInfoDialog(username, this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
this->close();
} else {
// 新用户:打开 UserInfoDialog 并等待保存信号
UserInfoDialog *infoDialog = new UserInfoDialog(username, this);
// 关键修复:确保信号与槽连接正确
connect(infoDialog, &UserInfoDialog::userInfoSaved, this, [this, username]() {
qDebug() << "Signal received: Switching to MyUserInfoDialog for user:" << username;
MyUserInfoDialog *dialog = new MyUserInfoDialog(username, this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
this->close(); // 关闭登录窗口
});
infoDialog->show();
}
}
他对已经保存的账号登陆时无法跳转到用户信息展示与修改的窗口 #include "userinfodialog.h"
#include "ui_userinfodialog.h"
#include "MyUserInfoDialog.h" // 用于显示最终用户信息
#include <QSettings> // 读写配置文件
#include <QMessageBox> // 弹出提示框
// 构造函数:初始化UI并加载用户数据
UserInfoDialog::UserInfoDialog(const QString &username, QWidget *parent) :
QDialog(parent),
ui(new Ui::UserInfoDialog),
m_username(username) // 保存当前登录的用户名
{
ui->setupUi(this);
setWindowTitle("完善用户信息"); // 设置窗口标题
// 设置年龄输入范围(1-150岁)
ui->spinAge->setRange(1, 150);
// 设置性别选项(男/女/其他)
ui->comboGender->addItems(QStringList() << "男" << "女" << "其他");
// 尝试从配置文件加载该用户的已有信息
QSettings settings("user_data.ini", QSettings::IniFormat); // 打开配置文件
settings.beginGroup("UserInfo/" + m_username); // 进入用户专属分组
// 加载姓名(如果存在)
QString name = settings.value("name").toString();
if (!name.isEmpty()) {
ui->txtName->setText(name); // 填充到输入框
}
// 加载年龄(如果存在且有效)
int age = settings.value("age", 0).toInt(); // 默认值为0
if (age > 0) {
ui->spinAge->setValue(age); // 填充到年龄选择器
}
// 加载性别(如果存在)
QString gender = settings.value("gender").toString();
if (!gender.isEmpty()) {
int index = ui->comboGender->findText(gender); // 查找性别选项索引
if (index >= 0) {
ui->comboGender->setCurrentIndex(index); // 设置选中项
}
}
settings.endGroup(); // 结束分组
}
// 析构函数:释放UI资源
UserInfoDialog::~UserInfoDialog()
{
delete ui;
}
// 保存按钮点击事件:将用户输入的信息保存到配置文件
void UserInfoDialog::on_btnSave_clicked() {
QSettings settings("user_data.ini", QSettings::IniFormat);
settings.beginGroup(m_username);
settings.setValue("name", ui->txtName->text());
settings.setValue("age", ui->spinAge->value());
settings.setValue("gender", ui->comboGender->currentText());
settings.endGroup();
emit userInfoSaved(); // 发射信号
close();
}
这是用户信息保存窗口 他对新用户保存信息后 点击保存后无法实现跳转到 用户信息展示与修改的窗口 #include "myuserinfodialog.h"
#include <QMessageBox> // 弹出提示框
#include "ui_myuserinfodialog.h"
#include <QSettings> // 读写配置文件
#include <loginwindow.h> // 用于返回登录界面
// 构造函数:初始化UI
MyUserInfoDialog::MyUserInfoDialog(const QString &username, QWidget *parent)
: QDialog(parent), m_username(username) { // 参数类型和 const 修饰符必须一致
ui->setupUi(this);
// 初始化逻辑...
ui->setupUi(this);
setWindowTitle("用户信息"); // 设置窗口标题
// 连接退出按钮信号
connect(ui->btnLogout, &QPushButton::clicked,
this, &MyUserInfoDialog::on_btnLogout_clicked);
// 从配置文件加载用户信息并显示
QSettings settings("user_data.ini", QSettings::IniFormat);
settings.beginGroup(username);
ui->lblNameValue->setText(settings.value("name").toString());
ui->lblAgeValue->setText(QString::number(settings.value("age").toInt()));
ui->lblGenderValue->setText(settings.value("gender").toString());
settings.endGroup();
}
// 析构函数:释放UI资源
MyUserInfoDialog::~MyUserInfoDialog() {
delete ui;
}
// 设置用户信息并更新UI显示
void MyUserInfoDialog::setUserInfo(const QString &name,
const QString &account,
const QString &gender,
int age) {
// 更新姓名、性别显示
ui->lblNameValue->setText(name);
ui->lblGenderValue->setText(gender);
// 账号脱敏处理(如:显示为"123****56")
ui->lblAccountValue->setText(maskAccount(account));
// 年龄特殊处理:如果未设置则显示"未设置"
if(age > 0) {
ui->lblAgeValue->setText(QString::number(age) + "岁");
} else {
ui->lblAgeValue->setText("未设置");
}
}
// 退出登录按钮点击事件
void MyUserInfoDialog::on_btnLogout_clicked() {
emit logoutRequested(); // 发出退出信号(未实际连接,可扩展)
accept(); // 关闭对话框(返回QDialog::Accepted)
}
// 账号脱敏函数:隐藏部分字符(如123456 -> 123****56)
QString MyUserInfoDialog::maskAccount(const QString &account) {
if (account.length() > 5) {
return account.left(3) + "****" + account.right(2); // 保留前3位和后2位
}
return account; // 长度不足时直接返回
}
// 修改密码按钮点击事件
void MyUserInfoDialog::on_btnChangePassword_clicked()
{
QString inputUser = ui->lineEditUsername->text().trimmed(); // 获取输入的用户名
QString inputPass = ui->lineEditOldPassword->text().trimmed(); // 获取旧密码
QString newPassword = ui->lineEditNewPassword->text(); // 获取新密码
QString confirmPassword = ui->lineEditConfirmPassword->text(); // 获取确认密码
// 验证输入完整性
if(inputUser.isEmpty() || inputPass.isEmpty() ||
newPassword.isEmpty() || confirmPassword.isEmpty())
{
QMessageBox::warning(this, "错误", "所有字段必须填写");
return;
}
// 从配置文件验证旧密码
QSettings settings("login_data.ini", QSettings::IniFormat);
settings.beginGroup("Users");
QString storedPass = settings.value(inputUser, "").toString(); // 获取存储的密码
// 验证旧密码是否正确
if(storedPass != inputPass)
{
QMessageBox::warning(this, "错误", "账号或原密码错误");
settings.endGroup();
return;
}
// 验证新密码一致性
if(newPassword != confirmPassword)
{
QMessageBox::warning(this, "错误", "新密码与确认密码不一致");
settings.endGroup();
return;
}
// 验证新密码不能与旧密码相同
if(newPassword == inputPass)
{
QMessageBox::warning(this, "错误", "新密码不能与旧密码相同");
settings.endGroup();
return;
}
// 更新密码到配置文件
settings.setValue(inputUser, newPassword); // 保存新密码
settings.endGroup();
settings.sync(); // 强制写入磁盘
QMessageBox::information(this, "成功", "密码修改成功!请重新登录");
// 关闭当前对话框
this->close();
// 创建并显示登录窗口
LoginWindow *login = new LoginWindow();
login->setAttribute(Qt::WA_DeleteOnClose); // 关闭时自动删除
login->show();
// 关闭父窗口(如果存在)
if (QWidget *parentWindow = parentWidget()) {
parentWindow->close();
}
}
// 旧密码显示/隐藏切换
void MyUserInfoDialog::on_checkBox_stateChanged(int state)
{
if (state == Qt::Checked) {
ui->lineEditOldPassword->setEchoMode(QLineEdit::Normal); // 显示明文
} else {
ui->lineEditOldPassword->setEchoMode(QLineEdit::Password); // 显示密文
}
}
// 新密码显示/隐藏切换
void MyUserInfoDialog::on_checkBox_2_stateChanged(int state)
{
if (state == Qt::Checked) {
ui->lineEditNewPassword->setEchoMode(QLineEdit::Normal); // 显示明文
} else {
ui->lineEditNewPassword->setEchoMode(QLineEdit::Password); // 显示密文
}
}
// 确认密码显示/隐藏切换
void MyUserInfoDialog::on_checkBox_3_stateChanged(int state)
{
if (state == Qt::Checked) {
ui->lineEditConfirmPassword->setEchoMode(QLineEdit::Normal); // 显示明文
} else {
ui->lineEditConfirmPassword->setEchoMode(QLineEdit::Password); // 显示密文
}
}
这是用户信息展示与修改窗口的代码 请找出问题