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;
}
相关推荐
江畔柳前堤17 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
Wang's Blog18 小时前
Go-Zero 项目开发47:自研微服务框架的必要性与核心结构设计
开发语言·微服务·golang
白鸽(二般)18 小时前
MinIO Java Client API
java·开发语言
hPw0eKIqD18 小时前
C++ 模板参数推导问题小记(非推导上下文)
开发语言·c++
临床数据科学和人工智能兴趣组19 小时前
要使用 R Markdown,首先需要安装 R 和 RStudio,接着安装 rmarkdown 包
开发语言·数据挖掘·数据分析·r语言·r语言-4.2.1
Nebula嵌入式19 小时前
【C语言】09-深入解析main函数
linux·c语言·开发语言·嵌入式
神罚天下ET21 小时前
c# ACME client (补充)
开发语言·c#
小灰灰搞电子21 小时前
Qt 实现魔法导航菜单源码分享
开发语言·qt
持敬chijing21 小时前
Python概述
开发语言·python
Quz1 天前
QML SpinBox 基础与步长控制:可编辑输入与自定义步长
qt