如何在 Sqlite 中存储 QRect?

No *_*ing 0 sqlite qt

我需要在 Sqlite 数据库中存储一个 QRect。(我已经四处搜索,但没有看到任何关于此的内容)

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

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

650*_*502 5

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

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

如果您不需要透明的持久性而只需要显式存储/检索对象,那么您可以选择您喜欢的序列化方法(例如,使用单个字符串,或为属性使用单独的字段)。每种方法都有优点和缺点,具体取决于您要对数据库执行的操作(例如,您要执行的搜索或更新类型)。

C++ 的另一个不幸之处在于它的元编程能力非常差(仅比 C 好一点),例如内省是不可能的。

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

Qt 本身已经有一些专门的序列化机制,QDataStream因此您可以将其用于您要查找的内容:例如QRect是可序列QList<T>化的,如果T是,则是可序列化的。

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

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;
}
Run Code Online (Sandbox Code Playgroud)

您可以直接将对象序列化到QByteArray

QByteArray ba = serialize(x);
Run Code Online (Sandbox Code Playgroud)

你可以反序列化它

X x = deserialize<X>(ba);
Run Code Online (Sandbox Code Playgroud)