使用具有自定义数据的QT树模型

使用具有自定义数据的QT树模型,qt,qt5,Qt,Qt5,这是容器对象的头文件 class Container { private: std::string stdstrContainerName; std::string stdstrPluginType; int iSegments; float fRadius; public: Container(); Container(std::string , std::string , int , float); Container(co

这是容器对象的头文件

class Container
 {
   private:
   std::string stdstrContainerName;
   std::string stdstrPluginType;
   int iSegments;
   float fRadius;

 public:
     Container();
     Container(std::string , std::string ,  int , float);
     Container(const  Container& obj);  
     ~Container();
     std::string GetName();
     std::string GetType();
     void SetName(std::string stdstrName);
  };
   Q_DECLARE_METATYPE( Container )
我使用容器作为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 TreeModel::data(const QModelIndex &index, int role) const
  {
    if (!index.isValid())
    return QVariant();

      if (role != Qt::DisplayRole && role != Qt::EditRole)
        return QVariant();

       TreeItem *item = getItem(index);
         return QString::fromStdString(item->data().GetName());
  }

  bool TreeModel::setData(const QModelIndex &index, const QVariant &val, int 
  role )
  {
     if (role != Qt::EditRole)
       return false;

      Container c = val.value<Container>();
      TreeItem *item = getItem(index);
      bool result = item->setData(c);

     if (result)
      emit dataChanged(index, index, { role });

     return result;
 }
QVariant树模型::数据(常量QModelIndex&index,int角色)常量
{
如果(!index.isValid())
返回QVariant();
if(角色!=Qt::DisplayRole&&role!=Qt::EditRole)
返回QVariant();
TreeItem*item=getItem(索引);
返回QString::fromStdString(item->data().GetName());
}
bool TreeModel::setData(常量QModelIndex和index,常量QVariant和val,int
(角色)
{
if(角色!=Qt::EditRole)
返回false;
容器c=val.value();
TreeItem*item=getItem(索引);
bool结果=项目->设置数据(c);
如果(结果)
emit dataChanged(索引,索引,{role});
返回结果;
}

我还可以发布项目的任何附加代码。

这里缺少的是您视图的代码

QAbstractItemView
派生视图不能单独显示
容器
QVariant
s

  • 或者您实现视图的方式是
    • 解释
      容器QVariant
      s并显示其
      GetName()
    • 提供一个编辑器,可以操作
      容器QVariant
      s
  • (更简单的方法)将固结层移动到模型中,然后
    • 返回
      item->GetName()
      ->GetType()
      ,具体取决于
      role
      index.column()
    • 从传入的文本操作
      QVariant val

你的树模型的
data()
函数看起来怎么样?@vahancho我已经用树模型数据函数更新了代码。我认为你应该从你的
容器
对象返回具体的数据,而不是将它转换成
QVariant
,即
返回QString::fromStdString(item->data().GetName())
setData()
中,您应该从该值构造一个
容器
对象,并将其设置为树项目。您需要从所选行获取模型索引,然后从树模型中通过该索引获取树项目,并从树项目获取其容器。我已经能够使树模型工作,但是,如何从树状视图中的选定行检索容器对象
  QVariant TreeModel::data(const QModelIndex &index, int role) const
  {
    if (!index.isValid())
    return QVariant();

      if (role != Qt::DisplayRole && role != Qt::EditRole)
        return QVariant();

       TreeItem *item = getItem(index);
         return QString::fromStdString(item->data().GetName());
  }

  bool TreeModel::setData(const QModelIndex &index, const QVariant &val, int 
  role )
  {
     if (role != Qt::EditRole)
       return false;

      Container c = val.value<Container>();
      TreeItem *item = getItem(index);
      bool result = item->setData(c);

     if (result)
      emit dataChanged(index, index, { role });

     return result;
 }