在QT树模型中使用自定义数据类型

在QT树模型中使用自定义数据类型,qt,qt5,Qt,Qt5,这是我对容器类的定义 class Container { private: std::string stdstrContainerName; std::string stdstrPluginType; std::string stdstrPluginName; int iSegments; float fRadius; public: Container(); explicit Container(std::string

这是我对容器类的定义

class Container
{
private:
      std::string stdstrContainerName;
      std::string stdstrPluginType;
      std::string stdstrPluginName;
      int iSegments;
      float fRadius;
public:
    Container();
    explicit Container(std::string strContainerName , std::string 
    strPluginName , std::string strPluginType, int segments , float 
     radius  );
  ~Container();
  std::string GetName();
  std::string GetType();
   void SetName(std::string stdstrName);
};
我希望树视图的节点将容器类的对象作为数据保存

这是TreeItem类的头文件

 class TreeItem
  {
  public:
    explicit TreeItem( const Container &data , TreeItem *parent = 0 );
   ~TreeItem();
    TreeItem *parent();
    TreeItem *child(int iNumber);
    int childCount() const;
    int childNumber() const;
    Container data() const;
    bool setData(const Container &data);
    bool insertChildren(int position, int count );
    bool removeChildren( int position  , int count );
private:
   QList<TreeItem*> childItems;
   Container itemData;
   TreeItem* parentItem;
};

您不能使用
容器
而不是
QVariant
,但可以在
QVariant
中使用
容器
。看一看

在声明
容器后将其添加到头文件中

class Container
{
private:
    // ...
public:
    Container();
    // ...
};

Q_DECLARE_METATYPE(Container); // You only need this once, so here is a good place
创建
容器
元类型时,可以按如下方式返回它:

QVariant data(const QModelIndex &index, int role) const override {
    TreeItem *item = ...;
    return QVariant::fromValue(item->data());
}
QVariant v = model()->data(index, role);
Container c = v.value<Container>();
在您的视图中,您检索
容器
,如下所示:

QVariant data(const QModelIndex &index, int role) const override {
    TreeItem *item = ...;
    return QVariant::fromValue(item->data());
}
QVariant v = model()->data(index, role);
Container c = v.value<Container>();
QVariant v=model()->数据(索引、角色);
容器c=v.值();

请注意,这只在同一个线程中起作用,否则您需要使用
qRegisterMetaType()
注册
Container
,甚至可能编写一个从/to
QVariant

不过,这并不适用于您的情况,因为模型和视图并不是设计为生活在不同的线程中