Qt——程序中的配置文件

1.应用程序在运行后都有一个初始化的状态

  • 一般而言:程序的初始状态是最近一次运行退出前的状态

如何保存和恢复程序状态?

2.状态参数的存储方式

  • 文本文件格式(xml、json等)
  • 轻量级数据库(Access、SQLite)
  • 私有二进制文件格式

Qt中的解决方案:

通过二进制数据流将状态参数直接存储在文件中

优势:

(1)参数的存储和读取简单高效,易于编码实现

(2)最终文件为二进制格式,不易被恶意修改

AppConfig.h

复制代码
#ifndef APPCONFIG_H
#define APPCONFIG_H

#include <QObject>
#include <QFont>

class AppConfig : public QObject
{
    Q_OBJECT
    
    QFont m_editorFont; //编辑器字体
    bool m_isAutoWrap; //是否自动换行
    bool m_isToolBarVisible; //工具栏是否可见
    bool m_isStatusBarVisible; //状态栏是否可见
    bool m_isValid; //配置是否有效
    
    bool restore(); //读取配置
public:
    explicit AppConfig(QObject *parent = 0); //创建一个代表历史配置的对象,读取状态参数
    explicit AppConfig(QFont font, bool isWrap, bool tbVisible, bool sbVisible, QObject *parent = 0); //创建一个代表当前配置的对象,存取当前状态
    bool store(); //保存配置到文件中
    QFont editorFont();
    bool isAutoWrap();
    bool isToolBarVisible();
    bool isStatusBarVisible();
    bool isValid();

signals:
};

#endif // APPCONFIG_H

AppConfig.cpp

复制代码
#include "AppConfig.h"
#include <QFile>
#include <QDataStream>
#include <QApplication>

AppConfig::AppConfig(QObject *parent) : QObject{parent}
{
    m_isValid = restore();
}
AppConfig::AppConfig(QFont font, bool isWrap, bool tbVisible, bool sbVisible, QObject *parent)
{
    m_editorFont = font;
    m_isAutoWrap = isWrap;
    m_isToolBarVisible = tbVisible;
    m_isStatusBarVisible = sbVisible;
    m_isValid = true;
}
bool AppConfig::restore()
{
    bool ret = true;
    QFile file(QApplication::applicationDirPath() + "/app.config");
    
    if( file.open(QIODevice::ReadOnly) )
    {
        QDataStream in(&file);
        in.setVersion(QDataStream::Qt_5_15);
        
        in >> m_editorFont;
        in >> m_isAutoWrap;
        in >> m_isToolBarVisible;
        in >> m_isStatusBarVisible;
        
        file.close();
    }
    else
    {
        ret = false;
    }
    return ret;
}
bool AppConfig::store()
{
    bool ret = true;
    QFile file(QApplication::applicationDirPath() + "/app.config");
    
    if( file.open(QIODevice::WriteOnly) )
    {
        QDataStream out(&file);
        out.setVersion(QDataStream::Qt_5_15);
        
        out << m_editorFont;
        out << m_isAutoWrap;
        out << m_isToolBarVisible;
        out << m_isStatusBarVisible;
        
        file.close();
    }
    else
    {
        ret = false;
    }
    return ret;
}
QFont AppConfig::editorFont()
{
    return m_editorFont;
}
bool AppConfig::isAutoWrap()
{
    return m_isAutoWrap;
}
bool AppConfig::isToolBarVisible()
{
    return m_isToolBarVisible;
}
bool AppConfig::isStatusBarVisible()
{
    return m_isStatusBarVisible;
}
bool AppConfig::isValid()
{
    return m_isValid;
}
相关推荐
学心理学的程序员3 分钟前
anydoc:Firecrawl 出的 Rust 文档转 Markdown,4ms 转换、14 种格式干翻 MarkItDown
开发语言·后端·rust·开源·firecrawl·claude code·anydoc
2501_9378609413 分钟前
从JDBC到数据访问:Java数据库编程完全指南
java·开发语言·数据库
FfHUCisI15 分钟前
Golang SSA 中间表示与优化 Pass
开发语言·后端·golang
JacksonMx19 分钟前
Java 服务调用下游接口注意点
java·开发语言
兔兔兔兔126 分钟前
记录C++ 11
开发语言·c++
撩得Android一次心动37 分钟前
Kotlin 语言【知识点整理2】
android·开发语言·kotlin
不会就选b41 分钟前
Linux之线程池(一)
java·开发语言
牛油果子哥q1 小时前
C++序列式容器深度精讲:vector/list/deque底层实现、扩容原理、迭代器失效、性能对比、工程选型避坑
开发语言·c++·list
渡我白衣1 小时前
Acceptor模块的设计与实现
java·linux·服务器·开发语言·网络·c++·人工智能
沫璃染墨1 小时前
《从零入门Linux系统篇(二十八):文件篇·一——Linux为什么“万物皆文件”:从C语言文件流到系统调用》
linux·运维·服务器·开发语言·c++·文件