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;
}
相关推荐
xcyxiner2 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner3 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner3 天前
DicomViewer (添加模型类)3
qt
xcyxiner4 天前
DicomViewer (目录调整) 2
qt
xcyxiner4 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR0066 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术6 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园6 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob6 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享6 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm