QT C++之保存界面设置为配置文件

案例描述:UDP网口通信IP端口配置。建立NetSet类。

功能概述:在Qt应用程序中实现界面配置的持久化存储,允许用户保存和加载网络连接参数(本地IP、本地端口、目标IP、目标端口),使配置在程序重启后仍然有效。

界面:

头文件netset.h:

cpp 复制代码
#ifndef NETSET_H
#define NETSET_H

#include <QDialog>

namespace Ui {
class NetSet;
}

class NetSet : public QDialog
{
    Q_OBJECT

public:
    explicit NetSet(QWidget *parent = nullptr);
    ~NetSet();

    QString g_locip = "";
    int g_locport = 0;
    QString g_dstip = "";
    int g_dstport = 0;

private:
    void loadConfig();  // 从配置文件读取配置
    void saveConfig();     // 保存配置到文件

private slots:
    void on_pushButton_connect_clicked(); // 连接按钮
    void on_pushButton_disconnect_clicked(); // 断开连接按钮

signals:
    void configChanged();  // 配置改变信号
    void disConnect();     // 断开连接信号

private:
    Ui::NetSet *ui;
    QString configFilePath;  // 配置文件路径

};

#endif // NETSET_H

源文件netset.cpp:

cpp 复制代码
#include "netset.h"
#include "ui_netset.h"
#include "netConnect.h"
#include <QHostAddress>
#include <QNetworkInterface>
#include <QFileInfo>
#include <QSettings>  // 配置文件的头

NetSet::NetSet(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::NetSet)
{
    ui->setupUi(this);
    setWindowTitle("配置窗口");

    // 设置配置文件路径(与可执行文件同目录)
    configFilePath = QCoreApplication::applicationDirPath() + "/config.ini";
    //    qDebug() << "配置文件路径:" << configFilePath;

    // 从配置文件加载设置
    loadConfig();

    // 填充IP地址列表
    //通过QNetworkInterface类来获取本机的IP地址和网络接口信息
    QList<QHostAddress> list = QNetworkInterface::allAddresses();
    foreach (QHostAddress address, list)
    {
        if (address.protocol() == QAbstractSocket::IPv4Protocol)
        {
            qDebug() << "My localhost IPv4 address: " << address.toString();

            ui->comboBox_localip->addItem(address.toString());
        }
    }

    // 设置当前值
    int index = ui->comboBox_localip->findText(g_locip);
    if (index >= 0) {
        ui->comboBox_localip->setCurrentIndex(index);
    } else if (!g_locip.isEmpty()) {
        ui->comboBox_localip->addItem(g_locip);
        ui->comboBox_localip->setCurrentText(g_locip);
    }

    //    ui->comboBox_localip->setItemText(0, g_locip);
    ui->lineEdit_localport->setText(QString::number(g_locport));
    ui->lineEdit_destip->setText(g_dstip);
    ui->lineEdit_destport->setText(QString::number(g_dstport));
}

NetSet::~NetSet()
{
    delete ui;
}

// 从配置文件加载设置
void NetSet::loadConfig()
{
    // 检查配置文件是否存在
    QFileInfo configFile(configFilePath);
    if (!configFile.exists()) {
        //qDebug() << "配置文件不存在,使用默认值"; // 中文报错
        //qDebug() << "NO";
        g_locip = "192.168.2.166";
        g_locport = 8899;
        g_dstip = "192.168.2.3";
        g_dstport = 8899;
        return;
    }

    // 打开配置文件
    QSettings settings(configFilePath, QSettings::IniFormat);

    // 读取服务器配置,如果读取失败则使用默认值
    QString ip = settings.value("Local/ip", "192.168.2.166").toString();
    quint16 port = settings.value("Local/port", 8899).toUInt();
    QString destip = settings.value("Dest/ip", "192.168.2.3").toString();
    quint16 destport = settings.value("Dest/port", 8899).toUInt();

    // 验证端口号是否有效
    if (port < 1 || port > 65535) {
        qDebug() << "端口号无效,使用默认值8899";
        port = 8899;
    }
    if (auvport < 1 || auvport > 65535) {
        qDebug() << "端口号无效,使用默认值8899";
        destport = 8899;
    }

    // 更新成员变量
    g_locip  = ip;
    g_locport  = port;
    g_dstip  = destip;
    g_dstport  = destport;

    qDebug() << "从配置文件加载配置:" << ip << ":" << port << destip << ":" << destport;
}

// 保存配置到文件
void NetSet::saveConfig()
{
    QSettings settings(configFilePath, QSettings::IniFormat);

    // 保存服务器配置
    settings.setValue("Local/ip", g_locip);
    settings.setValue("Local/port", g_locport);
    settings.setValue("Dest/ip", g_dstip);
    settings.setValue("Dest/port", g_dstport);

    // 立即写入文件
    settings.sync();

    qDebug() << "配置已保存: Local" << g_locip << ":" << g_locport
                 << "Dest" << g_dstip << ":" << g_dstport;
}

// 连接按钮
void NetSet::on_pushButton_connect_clicked()
{
    // 获取界面输入的值
    g_locip = ui->comboBox_localip->currentText();
    g_locport = ui->lineEdit_localport->text().toInt();
    g_dstip = ui->lineEdit_destip->text();
    g_dstport = ui->lineEdit_destport->text().toInt();

    saveConfig(); // 保存配置到文件

    // 方式1: 通过信号通知
    emit configChanged();

    // 方式2: 直接操作NetConnect对象(需要在NetSet中持有NetConnect指针)
    // if (netConnect) {
    //     netConnect->reloadConfig();
    //     netConnect->Connect();
    // }

    this->hide();
}

// 断开连接按钮
void NetSet::on_pushButton_disconnect_clicked()
{
    emit disConnect();
//    if (netConnect->isConnected()) {
//        netConnect->disconnectFromServer(); // 断开连接
//    }
}

配置文件保存功能实现笔记

一、功能概述

在Qt应用程序中实现界面配置的持久化存储,允许用户保存和加载网络连接参数(本地IP、本地端口、目标IP、目标端口),使配置在程序重启后仍然有效。

二、技术选型

使用QSettings类

QSettings是Qt提供的配置文件读写类,支持多种格式:

  • IniFormat:标准的.ini格式文件,人类可读

  • NativeFormat:Windows注册表或macOS的plist

  • XmlFormat:XML格式

本项目采用QSettings::IniFormat,便于调试和手动修改。

三、核心实现步骤

1. 定义配置文件路径

cpp 复制代码
// 构造函数中设置路径,与可执行文件同目录
configFilePath = QCoreApplication::applicationDirPath() + "/config.ini";

2. 成员变量设计

cpp 复制代码
// 存储配置数据的成员变量
QString g_locip = "";   // 本地IP
int g_locport = 0;      // 本地端口
QString g_dstip = "";   // 目标IP
int g_dstport = 0;      // 目标端口

3. 加载配置(loadConfig)

实现流程:

步骤 操作 说明
1 检查文件是否存在 使用QFileInfo::exists()
2 不存在则使用默认值 防止程序崩溃
3 创建QSettings对象 指定路径和格式
4 读取配置值 提供默认值作为后备
5 验证数据有效性 如端口号范围检查
6 更新成员变量 供界面显示使用

关键代码:

cpp 复制代码
QSettings settings(configFilePath, QSettings::IniFormat);
QString ip = settings.value("Local/ip", "192.168.2.166").toString();
quint16 port = settings.value("Local/port", 8899).toUInt();

4. 保存配置(saveConfig)

实现流程:

步骤 操作 说明
1 创建QSettings对象 指定路径和格式
2 写入配置值 使用分组/键结构
3 调用sync() 立即写入磁盘
4 输出调试信息 便于排查问题

关键代码:

cpp 复制代码
settings.setValue("Local/ip", g_locip);
settings.setValue("Local/port", g_locport);
settings.sync();  // 确保立即写入文件

5. 配置文件的组织结构

复制代码
[Local] 
ip=192.168.2.166 
port=8899 
[Dest] 
ip=192.168.2.3 
port=8899

四、界面与配置的交互流程

初始化流程

复制代码
构造函数启动
    ↓
设置配置文件路径
    ↓
loadConfig() → 读取文件/默认值 → 更新成员变量
    ↓
填充IP下拉列表
    ↓
将成员变量值显示到界面控件

保存流程(点击连接按钮)

复制代码
用户点击"连接"按钮
    ↓
从界面控件获取用户输入
    ↓
更新成员变量(g_locip/g_locport等)
    ↓
saveConfig() → 写入配置文件
    ↓
emit configChanged() → 通知其他模块
    ↓
隐藏配置窗口
相关推荐
北山有鸟2 分钟前
解决香橙派没有适配ov13855的3A算法
linux·c++·相机·isp
故事和你9140 分钟前
洛谷-【图论2-1】树4
开发语言·数据结构·c++·算法·动态规划·图论
故事和你9142 分钟前
洛谷-【图论2-1】树1
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
不会C语言的男孩1 小时前
C++ SLTL编程
java·开发语言·c++
码农-阿杰1 小时前
Java 线程等待唤醒机制深度解析:synchronized、ReentrantLock、LockSupport 底层实现对比
java·开发语言·c++
赤水无泪1 小时前
Qt 全模块汇总列表
开发语言·qt
十五年专注C++开发2 小时前
TypePerf:Windows 命令行性能计数器工具(CPU利用率、内存利用率、GPU利用率等)
c++·windows·typeperf
GoKu~2 小时前
QT视图界面
qt
王老师青少年编程2 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串排序】:字符排序
c++·字符串·csp·高频考点·信奥赛·字符串排序·字符排序
杜子不疼.2 小时前
【 C++ AI 大模型接入 SDK】 - 日志模块
开发语言·javascript·c++