首页 > 解决方案 > C++ builder:如何将 TRectF 转换为 Variant

问题描述

我正在使用 C++ Builder 10.2.3 (Rad Studio 10.2.3) 我正在尝试将 TRectF 转换为 Variant。但它似乎不起作用:

这是我正在尝试调整的 Qt 代码示例:

void File::appendRects(const QList<QRectF> &rects)
{
    QList<QVariant> newRects = m_metadata["Rects"].toList();
    foreach (const QRectF &rect, rects)
        newRects.append(rect);
    m_metadata["Rects"] = newRects;
} 

代码行 newRects.append(rect); 将 QRectF 添加到 QVariant 列表中。这意味着转换是自动完成的。

任何有效的解决方案?

标签: c++c++buildervariant

解决方案


TRectF不是Variant本机支持的类型,这就是您的“解决方案”不起作用的原因。

要将 a 存储TRectF在 a 中Variant,您必须:

  • TRectF数据存储为动态字节数组,例如:
TRectF rect = ...;
int bounds[] = {0, sizeof(rect)-1}; 
Variant v = VarArrayCreate(EXISTINGARRAY(bounds), varByte);
// alternatively:
// Variant v = VarArrayCreate(OPENARRAY(int, (0, sizeof(rect)-1)), varByte);
void *p = VarArrayLock(v);
memcpy(p, &rect, sizeof(rect));
VarArrayUnlock(v);
  • 根据定义自定义变体实现TCustomVariantType以表示TRectFa 中的数据:Variant

    默认情况下,变体不能保存记录、集合、静态数组、文件、类、类引用或指针的值。但是,您可以扩展 Variant 类型以使用这些类型的任何特定示例。您需要做的就是创建TCustomVariantType类的后代,以指示 Variant 类型如何执行标准操作。

    但是,请注意以下警告:

    注意:C++ 可以使用 Custom Variant 类型,但 TCustomVariantType 的后代必须在 Delphi 中实现。


推荐阅读