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;
}
相关推荐
sunshine22 girl5 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
菜鸟~noob2335 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
惊讶的猫6 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python
cmpxr_6 小时前
【MicroPython】如何刷新ESP8266的固件
开发语言·micropython
搭贝7 小时前
上厕所的时间搭好一套系统:AI自动生成实测
开发语言·人工智能·低代码·ai·php·搭贝
智感子7 小时前
智能称重·数据上云:从仪表读数到可追溯的计量凭证
开发语言·php
\光辉岁月/7 小时前
7.javase-面向对象
java·开发语言
weixin_531094697 小时前
heap_4内存管理
java·开发语言·算法
疯狂的维修7 小时前
关于用C#写电机起保停控制
开发语言·c#
geovindu9 小时前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式