1、要使一个类型能转为QVariant,得让QT认识这个类型,需要用到Q_DECLARE_METATYPE()。这样就认识了。
struct UserDefineData
{
QString testStr;
int testInt;
bool testBool;
}
Q_DECLARE_METATYPE(UserDefineData)
2、数据相互转换
然后我们就可以使用了。
UserDefineData uddata;
1、转为QVariant:
QVariant udvar = QVairant::fromValue(uddata);
2、从QVariant转为自定义类型,要先判断是否可以转换:
if(udvar.canConvert<UserDefineData>()) {
UserDefineData uddata2 = udvar.value<UserDefineData>();
}
3、如果你想要使用数据流QDataStream,那么需要重写操作符号<<和>>。且在使用QDataStream前,要先注册自定义类型(如UserDefineData)。
1、重写操作符合<<和>>
inline QDataStream &operator<<(QDataStream &out, const UserDefineData &udvar)
{
out << udvar.testStr << udvar.testInt << udvar.testBool;
return out;
}
inline QDataStream &operator>>(QDataStream &in, UserDefineData &udvar)
{
out >> udvar.testStr >> udvar.testInt >> udvar.testBool;
return in;
}
2、使用
//先要注册
qRegisterMetaTypeStreamOperators<UserDefineData>("UserDefineData");
//初始化自定义数据
UserDefineData uddata;
uddata.testStr = "hh";
uddata.testInt = 1;
uddata.testBool= true;
//转为QVariant:
QVariant udvar = QVairant::fromValue(uddata);
//写到外部
QByteArray byteTest;
QDataStream inStream(&byteTest, QIODevice::WriteOnly);
inStream << udvar;
//读取转为自定义数据
QVariant outvariant;
QDataStream outStream(&byteTest, QIODevice::ReadWrite);
outStream >> outvariant;
//还原为自定义类型
if(outvariant.canConvert<UserDefineData>()) {
UserDefineData uddata2 = outvariant.value<UserDefineData>();
}
如果没有注册,自定义类型使用QDataStream(<< 或>>操作符号)会报错如下:invalid type to save
原创不易,喜欢就点个赞吧。