当前位置: 首页 > news >正文

QT通用配置文件库(QPreferences)

QT通用配置文件库(QPreferences)

QPreferences项目是基于nlohmann/json的qt可视化配置文件库,将配置保存成json格式,并提供UI查看与修改,可通过cmake可快速添加进项目。默认支持基本类型、stl常用容器、基本类型与stl容器组成的结构体,若想添加不支持的类型,可参考nlohmann/json自行实现to_json和from_json函数。
QPreferences - github源码

项目使用步骤

1. 创建配置文件结构体

QPREFERENCES_STRUCT(配置结构体名, 配置文件路径, 类型1, 变量名1, 默认值1, 类型2, 变量名2, 默认值2...
)

注意事项:

  • 配置文件路径可写绝对路径或相对路径,若为子配置结构体则写""
  • 变量名需要与json文件中的元素命名相同,否则会加载失败
  • 默认值必须要加括号,参考下一节示例
  • 最多支持40个变量(若不够则使用结构体嵌套,结构体算一个变量)

2. 在程序开头加载配置文件

        通过上面的宏定义创建的结构体会继承QPreferences,QPreferences是一个单例类保证了全局只有一个配置结构体变量,通过GetInstance()接口返回配置结构体指针。QPreferences有三个可继承调用的成员函数load()save()showUI(),功能分别为加载、保存、显示配置文件。
        一般情况下,我们需要在程序开头调用load(),否则参数都是默认值。当设置了配置文件路径且硬盘不存在该文件时,会自动创建json配置文件并写入默认值。创建配置文件在构造函数里判断是否要创建,一定会在执行load()之前,所以在程序开头放心load就好。

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);Preferences::GetInstance()->load();
}

3. 将显示接口写入对应动作

void MainWindow::on_pushButton_clicked()
{Preferences::GetInstance()->showUI();
}

示例

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include "Preferences.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);Preferences::GetInstance()->load();
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_pushButton_clicked()
{Preferences::GetInstance()->showUI();
}

Preferences.h源码

#pragma once#include <QPreferences.hpp>
#include <vector>
#include <string>QPREFERENCES_STRUCT(SubPref, "", int           , sub_option1, (0), double        , sub_option2, (5.0), std::string   , sub_option3, ({"wizalm"}))QPREFERENCES_STRUCT(Preferences, "Preferences/Preferences.json", int               , option1   , (1), double            , option2   , (2), std::vector<int>  , option3   , ({1, 2, 3}), SubPref           , sub_pref  , ())

配置文件显示,双击可修改,会修改后会判断输入值是否与原本类型兼容,若不兼容则输入无效。
QPreferences的UI显示图片

QPreferences_demo

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【云原生】Prometheus整合Alertmanager告警规则使用详解
  • [集成学习]基于python的Stacking分类模型的客户购买意愿分类预测
  • CentOS 7 yum官方源失效
  • 分布式ID是什么?有哪些解决方案?
  • 准备跳槽了(仍然底层为主,ue独立游戏为辅)
  • 贝叶斯算法理论
  • vue3 antdv3 a-range-picker a-date-picker 获取选择中的日期值
  • LeetCode热题100刷题16:74. 搜索二维矩阵、33. 搜索旋转排序数组、153. 寻找旋转排序数组中的最小值、98. 验证二叉搜索树
  • Python学习笔记40:游戏篇之外星人入侵(一)
  • 【Linux】汇总TCP网络连接状态命令
  • 【Django】网上蛋糕商城后台-订单管理
  • Learning vtkjs之WarpScalar
  • HOW - 保证 WebSocket 持续正常连接
  • [解决方法]Request failed with status code 500错误之一
  • AI测试入门(1):认识AI大语言模型(LLM)
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • REST架构的思考
  • Selenium实战教程系列(二)---元素定位
  • tweak 支持第三方库
  • Vue--数据传输
  • 闭包--闭包之tab栏切换(四)
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 聚类分析——Kmeans
  • 前端自动化解决方案
  • 系统认识JavaScript正则表达式
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 一些css基础学习笔记
  • 选择阿里云数据库HBase版十大理由
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #stm32整理(一)flash读写
  • (办公)springboot配置aop处理请求.
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三)模仿学习-Action数据的模仿
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (五)c52学习之旅-静态数码管
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)母版页和相对路径
  • ***检测工具之RKHunter AIDE
  • .htaccess配置重写url引擎
  • .net MySql
  • .Net OpenCVSharp生成灰度图和二值图
  • .NET/ASP.NETMVC 大型站点架构设计—迁移Model元数据设置项(自定义元数据提供程序)...
  • .NET单元测试
  • .NET上SQLite的连接
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @media screen 针对不同移动设备
  • [ C++ ] STL---string类的模拟实现
  • [ C++ ] template 模板进阶 (特化,分离编译)
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具
  • [AIGC] 如何建立和优化你的工作流?
  • [android]-如何在向服务器发送request时附加已保存的cookie数据
  • [AWS]CodeCommit的创建与使用