将QT树模型与自定义数据一起使用

时间:2019-04-26 09:23:08

标签: qt qt5

这是我的Container对象的头文件。

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 )

我使用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;
  };

问题是当我向树结构中添加行时,会添加行,但行上没有文本。 我想将stdstrContainerName中的数据设置为该行上的数据。

如果我尝试写一些东西,它不会留下。

我认为问题出在我的将数据设置为TreeItem对象的函数中

  Container TreeItem::data() const
   {
      return itemData;
    }

    bool TreeItem::setData(const Container &data , QVariant value )
      {
        itemData = data;
        itemData.SetName(value.toString().toStdString() );
        return true;
     }

/

树模型的数据功能

  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;
 }

我还可以发布该项目的任何其他代码。

1 个答案:

答案 0 :(得分:1)

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

派生自build/hsc的视图不能单独显示QAbstractItemView Container

  • 任何一个,您都可以通过以下方式实现视图
    • 解释QVariant并显示例如其Container-QVariant
    • 提供了可以操纵GetName()的编辑器
  • 更简单的方法),您将凝固层移入模型,然后
    • 根据Container-QVariantitem->GetName()返回->GetType()role
    • 根据index.column()中传递的文本来操作Container中的TreeItem实例