Drag and drop in QTreeWidget with custom class (Error :Qvariant::save)

Drag and drop in QTreeWidget with custom class (Error :Qvariant::save)

我的问题如下: 我想在我的 QTreeWidget 中使用拖放操作。我的 QtreeWidgetItem 具有以下标志 Enabled | selectable |Drag | Drop.

它适用于一个项目但不适用于其余项目(错误 Qvariant::Save 无效类型保存)

因为我们做了一些: setdata(QVariant::fromvalue<...

我明白因为我想使用自定义数据,我需要让 QVariant 理解我的 class,为此我需要我的 class 有一个默认构造函数,一个复制构造函数,一个析构函数和 2 个运算符霸主 << 和 >>.

friend QDataStream & operator << (QDataStream &arch, const MyClass & object)

在我需要 Q_DECLARE_METATYPE(MyClass) 并使用 :

注册我的操作员之后

qRegisterMetaTypeStreamOperators<MyClass>("MyClass")

但我无法让它工作。 (仍然错误 Qvariant::Save 要保存的类型无效)

我需要帮助才能了解一切进展。 我的重载运算符在我的 class (.H)

中定义

我的 Q_DECLARE_METATYPE 应该在我的 class 的末尾声明吗? (.h) 会不会有问题因为somme class 继承自它?还是因为它有纯粹的功能?

我知道很多人在 main 中使用 qRegisterMetaTypeStreamOperators 但我不能那样做,我可以在其他地方使用它吗(在我的 class 的构造函数中,否则这会导致问题(如多重声明或多次调用,例如连接功能))

错误永远不会改变,这是正常现象还是 Qt 应该告诉我 "it recognizes the class I want to save but it doesn't everything needed"?


好的,我回答了我的一些问题: Q_DECLARE_METATYPE 不需要在 .H 中(现在使用我的 .cpp) 您可以在构造函数中使用 qRegisterMetaTypeStreamOperators (作为连接) 当 QT 重新识别你的 class 时,它会显示另一条消息(现在我的问题是我的 class 是一个抽象的 class)

我正在尝试让它与我当前的架构一起工作

MyClass (Abstract)
  - MyClassTemplate : MyClass
      -MyClassA : MyClassTemplate<MyClassA>
      -MyClassB : MyClassTemplate<MyClassB>

好的,我知道了。 你可以使用一个简单的技巧。 创建一个结构,它有一个指向您要传递的 class 的指针,并且在 class 中有运算符 << 和 >>。 Q_Dclare_Metatype(你的结构) 不要忘记 qRegisterMetaTypeStreamOperators 你的结构

因为你的 class 元素永远不会被破坏,你可以毫无风险地传递一个指向它的指针,并且因为你声明了你将传递的类型,qt 接受它 (因为当我只是使用 void * 或其他指针类型时,qt reconisez 它具有特定类型并且不会工作。

希望对遇到同样问题的你有所帮助