【问题标题】:C++ builder: How to convert TRectF to VariantC++ builder:如何将 TRectF 转换为 Variant
【发布时间】:2021-08-06 21:15:22
【问题描述】:

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

  • 第一种解决方案:使用 TValue::From(rect).AsVariant() 或 AsType()。我收到错误消息:无效的类类型转换
  • 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 列表中。这意味着转换是自动完成的。

任何有效的解决方案?

【问题讨论】:

  • “但我不能使用它,因为 __delphirtti() 不能与 TRectF 一起工作” 确切的问题是什么。如果您想获得帮助,请发布minimal reproducible example。因为你的问题太模糊了。

标签: c++ c++builder variant


【解决方案1】:

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

要将TRectF 存储在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 以表示Variant 中的TRectF 数据,根据Defining Custom Variants

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

    但是,请注意以下警告:

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

【讨论】:

  • Variant 原生支持的类型列表:TVarData
  • 问题是事实上 TRectF 是一堆类型和用户定义的类的一个例子,我需要以同样的方式进行转换。我将不得不对 TRect、TPoint、TPointF、TVariantList、cv::RotatedRect(来自 OpenCV)等应用相同的解决方案......有更直接的解决方案吗?
  • @Louis Variant 根本不支持任何这些类型,所以你必须坚持我所说的。您为什么要尝试将这些类型放入Variant 中?你想用它做什么?
  • 我有一些使用 Qt 编写的算法,我正在尝试在 C++ Builder 中进行调整和导入。碰巧这些类型的转换非常容易,有时只是使用 Qt 自动完成。
  • @Louis Qt 是一个纯 C+ 库,它没有 Variant 的概念,所以不清楚你到底想要完成什么。您能否更新您的问题以提供示例?也许您正试图将 Qt 的 QVariant 的逻辑调整为 C++Builder 的 Variant?您可能最终不得不为此走TCustomVariantType 路线,但cv::RotatedRect 除外,这需要更多工作才能将其导入Delphi。 std::variant 可能是更好的选择,但请注意它在 C++Builder 中被严重破坏。
猜你喜欢
  • 2010-12-30
  • 2010-10-11
  • 2014-09-13
  • 2017-01-26
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多