使用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<<(QDataStream &out, const MBRTU_QueueSize &queue_size)
{
out << queue_size.ReadDRQueue_MaxNum << queue_size.ReadCRQueue_MaxNum