QSettings 写入失效,居然是路径的问题

本文探讨了Qt中QSettings模块的使用技巧,特别强调了路径设置的重要性。通过实例演示了如何正确使用setValue进行配置文件的写入操作,并解析了“:/”路径引用资源的误区,最终给出了正确的路径写法。

如题
今天看了看QSettings 的用法
用value读,用setValue写
代码如下:

#include <QCoreApplication>
#include <QDebug>
#include <QString>
#include <QSettings>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QSettings  *m_IniFile = new QSettings(":/Setting.ini", QSettings::IniFormat);
    QString age = m_IniFile->value("section1/sex").toString();
    qDebug()<<age;
    m_IniFile->setValue("section1/sex",  "feman");
    age = m_IniFile->value("section1/sex").toString();
    qDebug()<<age;
    delete m_IniFile;
    return a.exec();
}

但是问题来了,运行的结果,可以看得出来,写入成功了。
但是奇怪的是,再次运行,结果还是这样,查看文件,发现根本就没有写入成功
在这里插入图片描述
这就令人很头疼了,最后搞了半天,才发现,是路径写错了。
“:/”的写法是引用资源文件的写法,将其去掉就可以了;
在这里插入图片描述
最后不得不,再来整理一下路径相关:
./ : 表示当前路径 如“./log/log1.txt” 表示当前路径下的log目录下的log1.txt
:/ : 表示对资源的引用,引用资源文件路径 如“:/image/start.png” 表示资源文件里面定义的文件start.png

其实还是没有料到居然是Qt中这个路径的写法的问题。
麻辣鸡,菜狗!

这是登录的代码 :#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); // 显示密文 } } 这是用户信息展示与修改窗口的代码 请找出问题
07-07
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值