Использование модели дерева QT с пользовательскими данными - PullRequest
0 голосов
/ 26 апреля 2019

Это мой заголовочный файл для объекта-контейнера.

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

Проблема в том, что когда я добавляю строки в древовидную структуру, строки добавляются, но без текста на них. Я хочу установить данные в 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 Ответ

1 голос
/ 26 апреля 2019

Здесь отсутствует код вашего представления.

A QAbstractItemView производное представление не может отображать Container QVariant s само по себе.

  • Либо Вы реализуете свое представление таким образом, что оно
    • интерпретирует Container-QVariant s и отображает, например, его GetName()
    • предоставляет редактор, который может манипулировать Container-QVariant s
  • или ( более простой метод ) вы сдвигаете слой конкремента в вашу модель и
    • возвращаете item->GetName(), ->GetType() в зависимостиrole и index.column()
    • манипулируют экземпляром Container в TreeItem из текста, переданного в QVariant val
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...