拖放具有自定义类的QTreeWidget(错误:Qvariant :: save)

时间:2019-04-03 09:01:22

标签: qt c++11 qtreewidget qvariant

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

它适用于某个项目,但不适用于其他项目(错误Qvariant :: Save无效类型以保存)

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

我了解了,因为我想使用自定义数据,因此我需要让QVariant了解我的类,为此,我需要让我的类具有默认的构造函数,复制构造函数,析构函数和2个运算符霸主<<和> >。

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

在我需要Q_DECLARE_METATYPE(MyClass)并向:注册我的运营商之后。

qRegisterMetaTypeStreamOperators<MyClass>("MyClass")

但是我无法正常工作。 (仍然是Error Qvariant :: Save无效类型以保存)

我需要帮助来了解一切。 我的重载运算符在类(.H)中定义

我的Q_DECLARE_METATYPE是否应在课程结束时声明? (.h)是否会因为somme类继承而出问题?还是因为它具有纯功能?

我知道很多人都在主要使用qRegisterMetaTypeStreamOperators,但是我不能这样做,我可以在其他地方使用它吗(在我的类的构造函数中,否则会引起问题(例如多次声明或多次调用,例如connect functiun) ))

错误永远不会改变,这是正常现象吗?还是Qt应该对我说“它识别出我要保存的类,但并不需要所有内容”?


好的,我回答了一些问题: Q_DECLARE_METATYPE不必位于.H中(现在可以与我的.cpp一起使用) 您可以在构造函数中使用qRegisterMetaTypeStreamOperators(作为连接) 当QT调整您的班级时,它将显示另一条消息(现在我的问题是我的班级是抽象班级)

我正在尝试使其与我当前的体系结构兼容

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

1 个答案:

答案 0 :(得分:0)

好吧,我明白了。 您可以使用一个简单的技巧。 创建一个结构,该结构具有要传递的类的指针,并且在该类中具有运算符<<和>>。 Q_Dclare_Metatype(您的结构) 不要忘记为您的结构qRegisterMetaTypeStreamOperators

由于您的类元素从未被销毁,因此您可以毫无危险地传递一个指向它的指针,并且由于您声明了要传递的类型,因此qt接受它 (因为当我只是使用void *或其他指针类型时,qt会认为它具有特定的类型并且无法正常工作。

希望如果您遇到同样的问题也会对您有所帮助