首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将QRect存储在Sqlite中?

如何将QRect存储在Sqlite中?
EN

Stack Overflow用户
提问于 2013-08-12 18:57:19
回答 3查看 1.7K关注 0票数 0

我需要将QRect存储在Sqlite数据库中。(我到处找过了,但没有看到任何东西)

Qt/QSQLITE是否会自动将QRect转换为QVariant并处理所需的任何分解,还是必须亲自完成此操作,并将原始值和大小值存储在四个单独的字段中?

如果是这样,并将其推广到其他Qt数据类型,是否可以存储QVector、QList?我会定义这些(和QRect等)吗?在我的表定义中作为BLOB类型?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-12 19:24:28

SQLite是一个关系数据库,这些东西不能直接存储C++对象。

实际上,C++对象模型不允许完全透明的持久性,但是您可以尝试使用专门的工具或库来接近。然而,重要的一点是,对象本身必须设计为支持持久性。

如果您不需要透明的持久化,而只需要对对象进行显式存储/检索,那么您只需要选择一个您喜欢的序列化方法(例如,使用单个字符串,或者对属性使用单独的字段)。每个方法都有优点和缺点,这取决于您想要对数据库做什么(例如,您想做什么样的搜索或更新)。

C++的另一个不幸之处是它的元编程能力非常差(只是比C稍好一点),例如,反思是不可能的。

这意味着您需要为需要支持的每个类编写序列化代码,或者需要找到/购买一个外部工具,查看类定义.h将为您生成所需的代码。它必须是一个外部工具,因为序列化是模板元编程非常有限的范围之外的东西。

Qt本身已经有了一些专门的序列化机制QDataStream,因此您可以使用它来满足您的需要:例如,QRect是可序列化的,而如果T是可序列化的,则QList<T>是可序列化的。

使用它需要先序列化到QByteArray,然后将blob存储在SQLite中。例如,在写完之后

代码语言:javascript
复制
template<typename T>
QByteArray serialize(const T& x)
{
    QByteArray ba;
    QDataStream s(&ba, QIODevice::WriteOnly);
    s << x;
    return ba;
}

template<typename T>
T deserialize(QByteArray& ba)
{
    QDataStream s(&ba, QIODevice::ReadOnly);
    T res; s >> res;
    return res;
}

可以将对象直接序列化为QByteArray

代码语言:javascript
复制
QByteArray ba = serialize(x);

并且您可以用

代码语言:javascript
复制
X x = deserialize<X>(ba);
票数 5
EN

Stack Overflow用户

发布于 2013-08-12 19:08:21

您可以将QRect存储在另一个表中,该表将(例如) id, x, y, h, w作为列。

当您想要存储QRect时,在新创建的表中创建新行,获取它的id并将其存储在目标表中。

QVectorQList是容器,其中QRect是一个简单的结构。您可以将它保存在一个单独的表中(每个条目有一行),或者只需将容器保存到serialize列中。

票数 1
EN

Stack Overflow用户

发布于 2013-08-12 19:06:09

不,你必须自己做。如何将QRect存储到Sqlite中取决于您和您的需求。使用QDataStream存储单个值,将整个数据类型序列化为文本、BLOB或其他任何内容.最适合你的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18194582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档