我正在尝试使用QMetaType对象加载和存储自定义的QDataStream。下面是一个示例:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QString test1("/test1/");
const QString path1(QDir::homePath()+test1);
qDebug() << "path1 variable is " << path1;
QDir apphome(path1);
qDebug() << "apphome path is " << apphome.absolutePath();
if (!apphome.mkdir(path1)) { qDebug() << "mkdir returned false. directory already exists?"; }
if(!apphome.setCurrent(path1)) { qDebug() << "did not set current directory"; }
qDebug() << "apphome path is " << apphome.absolutePath();
Basic basic1;
Basic basic2;
basic1.value = 14;
QFile file1("file1name");
if (!file1.open(QIODevice::WriteOnly)) { qDebug() << "file1 not open."; }
QDataStream dataStream1(&file1);
QVariant qvar1;
qvar1.setValue(basic1);
dataStream1 << (quint32)12345;
dataStream1 << qvar1;
file1.close();
file1.open(QIODevice::ReadOnly);
QDataStream dataStream2(&file1);
quint32 magic;
QVariant qvar2;
dataStream1 >> magic;
qDebug() << "magic number is " << magic;
dataStream2 >> qvar2;
file1.close();
basic2 = qvar2.value<Basic>();
qDebug() << "14 = " << basic1.value << " = " << basic2.value << ".";
//MainWindow w;
//w.show();
return a.exec();
}神奇的数字回来了,但是有一个消息QVariant::save: unable to save type 'Basic' (type id: 1026).,然后当然是QVariant::load: unable to load type 1026.,然后是14 = 14 = 0。基本类仅来自QMetaType文档:
struct Basic
{
Basic();
Basic(const Basic &basic);
~Basic();
int value;
};
Q_DECLARE_METATYPE(Basic)
// basic.cpp
#include "basic.h"
Basic::Basic() {}
Basic::Basic(const Basic &basic)
{
value = basic.value;
}
Basic::~Basic(){}我的想法不多了,有人知道是什么导致了这个问题吗?Qt的版本为5.10.1。
发布于 2018-05-18 20:18:36
因为编译器无法读懂您的想法,所以您需要描述序列化是如何实现的。
struct Basic
{
Basic();
Basic(const Basic &basic);
~Basic();
int value;
friend QDataStream & operator << (QDataStream &arch, const Basic& object)
{
arch << object.value;
return arch;
}
friend QDataStream & operator >> (QDataStream &arch, Basic& object)
{
arch >> object.value;
return arch;
}
};
Q_DECLARE_METATYPE(Basic);主要()
qRegisterMetaType<Basic>("Basic");
qRegisterMetaTypeStreamOperators<Basic>("Basic");在保存\加载操作发生之前。Q_DECLARE_METATYPE需要用QVariant存储类型,这两种类型都需要注册对象的“大三”,以便将其管理为资源及其序列化方法。输出:
path1 variable is "C:/Users/Yaroslav/test1/"
apphome path is "C:/Users/Yaroslav/test1"
mkdir returned false. directory already exists?
apphome path is "C:/Users/Yaroslav/test1"
magic number is 12345
14 = 14 = 14 .请注意,如果您离开return a.exec();时没有窗口,那么程序将永远留在内存中,直到停止为止。
https://stackoverflow.com/questions/50418380
复制相似问题