使用QSettings保存和读取自定义数据类型

使用QSettings保存和读取自定义数据类型

Date Author Version Note
2021.02.02 Dog Tao V1.0 完成文档的撰写。

QVariant与自定义结构体转化

1、将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别。示例如下:

///定义了Modbus RTU的通讯串口结构体,包含了各项串口参数
struct MBRTU_Port
{
   
	  char portName[100];         //串口名: e.g. "COM2"
    int baudRate;               //波特率: e.g. 9600, 115200
    char parity;                //校验位: 'N': None 'E': Even 'O': Odd
    int dataBit;                //数据位: 7, 8
    int stopBit;                //停止位: 1, 2

    MBRTU_Port():
        baudRate(115200), parity('N'), dataBit(8), stopBit(1)
    {
   
        strcpy_s(portName, "");
    }

    MBRTU_Port(const char *_portName, int _baudRate, char _parity, int _dataBit, int _stopBit):
        baudRate(_baudRate), parity(_parity), dataBit(_dataBit), stopBit(_stopBit)
    {
   
        strcpy_s(portName, _portName);
    }

		/// 省略重载输入输出运算符部分
};
Q_DECLARE_METATYPE(MBRTU_Port)

2、在插入对象的时候,声明QVariant对象,使用其setValue方法或者fromValue方法添加自定义对象。

	QVariant Variant_MBRTU_Port = QVariant::fromValue<MBRTU_Port>(MBRTU_Port());

	QVariant Variant_MBRTU_Port1 = QVariant::fromValue(MBRTU_Port());

	QVariant Variant_MBRTU_Port2;
	Variant_MBRTU_Port2.setValue(MBRTU_Port());

3、在读取的时候,采用QVariant对象的value方法或者qvariant_cast方法返回自定义对象。

MBRTU_Port mbrtu_Port = Variant_MBRTU_Port.value<MBRTU_Port>();

MBRTU_Port mbrtu_Port =  qvariant_cast<MBRTU_Port >(Variant_MBRTU_Port);

QVariant在QSetting中的读写

QSetting中如果读写的QVariant类型是由自定类型数据封装得到的,则会报错“QVariant::save: unable to save type ‘XXXX’ (type id: xxxx).”。相应的解决办法如下:

1、在用qsettings读出某一条记录前需增加qRegisterMetaTypeStreamOperators的声明;

void ModbusRTUMaster::Settings_Load()
{
   
    qRegisterMetaTypeStreamOperators<MBRTU_Port>("Variant_MBRTU_Port");
    qRegisterMetaTypeStreamOperators<MBRTU_Port_Exd>("Variant_MBRTU_Port_Exd");
    qRegisterMetaTypeStreamOperators<MBRTU_Polling>("Variant_MBRTU_Polling");
    qRegisterMetaTypeStreamOperators<MBRTU_QueueSize>("Variant_MBRTU_QueueSize");

    settings->beginGroup("MBRTU_Panel");

		/// 省略无关代码

		settings->endGroup();
} 

2、需要重载关于自定义结构体的输入和输出操作符。C++中重载输入与输出运算符的介绍可以参考这个文档。在用qsettings保存一条记录的时候,就用该结构体的输出操作符把结构体内容读出到流,然后把流中的内容保存到文件,同样,在用qsettings读出一条记录时,就需要用到该结构体的输出操作符,把结构体内容输出到流,然后我们才能从流中读到该结构体的内容。

///定义了Modbus RTU的轮询相关参数
struct MBRTU_QueueSize
{
   
		/// 省略结构体定义部分

    /// 重载输出运算符
    friend QDataStream &operator<<
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全能骑士涛锅锅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值