c++ - C++ builder:如何将 TRectF 转换为 Variant
问题描述
我正在使用 C++ Builder 10.2.3 (Rad Studio 10.2.3) 我正在尝试将 TRectF 转换为 Variant。但它似乎不起作用:
- 第一种解决方案:使用 TValue::From(rect).AsVariant() 或 AsType()。我收到错误消息:Invalid Class TypeCast
- 2e 解决方案:将 TValue::Make() 与 ExtractRawData 一起使用。但我不能使用它,因为 __delphirtti() 不能与 TRectF 一起使用。
这是我正在尝试调整的 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 列表中。这意味着转换是自动完成的。
任何有效的解决方案?
解决方案
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
以表示TRectF
a 中的数据:Variant
默认情况下,变体不能保存记录、集合、静态数组、文件、类、类引用或指针的值。但是,您可以扩展 Variant 类型以使用这些类型的任何特定示例。您需要做的就是创建
TCustomVariantType
类的后代,以指示 Variant 类型如何执行标准操作。但是,请注意以下警告:
注意:C++ 可以使用 Custom Variant 类型,但 TCustomVariantType 的后代必须在 Delphi 中实现。
推荐阅读
- flutter - 当我在 Stack(Positoned) 中使用 ListView 时出现问题
- python - 何时使用 int() 以及何时使用 var: int
- flutter - inappwebview中的全屏图标在颤动中太小了
- entitymanager - 何时以及为何在 MikroOrm 中使用 em.clear()
- coq - Coq 上的微积分
- c++ - 使用 C++ 读写 NtGlobalFlags
- python - 如何验证 pathlib.glob 的结果?
- python - 使用 PIL 和 tkinter 动态调整图像大小
- webpack - 如何使用 webpack 发出编译后的 scss 并获取输出 url?
- c# - blazor 中的 ComponentReferenceCapture 更新