- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 QDataStream 对象加载和存储自定义 QMetaType。这是一个例子:
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();
}
魔数(Magic Number)回来了,但是有一条消息 QVariant::save: unable to save type 'Basic' (type id: 1026).
然后当然是 QVariant::加载:无法加载类型 1026.
,然后是 14 = 14 = 0
。 Basic 类仅来自 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。
最佳答案
因为编译器无法读懂你的想法,你需要描述序列化是如何可能的,例如
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();
,程序将永远保留在内存中,直到您停止它。
关于c++ - 将自定义 QMetaType 与 QDataStream 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50418380/
是否可以确定模板参数的QMetaType::Type值。 我尝试了这个: template class MyClass { public: int getType() { r
我已经 typedef ProxyTray TrayType;在我的类(class)中(是 QObject 但ProxyTray 不是 QObject)。我在 Signal, Slots 中使用该类型
好的,所以我对 Qt 和 C++ 都不熟悉。我正在尝试使用 QMetaType与我自己的类,我不能让它与子类一起工作。这是我所拥有的(可能有很多问题,抱歉): 测试父类.h: #include cl
我有: struct myStruct { int m_valueA; float m_valueA; bool m_valueA; }; Q_DECLARE_METATYPE
我想根据其名称实例化一个类。我发现 Qt 允许使用 QMetaType::create。 我还发现我们必须使用 Q_DECLARE_METATYPE 注册类。但我做了所有需要的事情(我认为),但没有奏
我有一个遍历 Qt 插件元数据的递归函数。从 QMetaType 获取 QMetaObject 很简单,但是我找不到任何可以让我从 QMetaObject 获取 QMetaType 的东西。请看下面的
我正在尝试使用 QDataStream 对象加载和存储自定义 QMetaType。这是一个例子: int main(int argc, char *argv[]) { QApplication
我的公司正在考虑从 Qt 4.8.4 跳转到 Qt 5.4,但我遇到了一个对我们来说可能是个阻碍的变化:QMetaType::unregisterType() 被删除了(http://doc.qt.i
我有一个运行良好的应用程序,但它不是在打开警告的情况下编译的。我正在尝试将其重新打开并整理它们,但没有关于如何解决此问题的想法。我有: QVariant someVar QVariant::T
关于 QVariant::type() 的文档说: Returns the storage type of the value stored in the variant. Although this
我是一名优秀的程序员,十分优秀!