Получить значение из выбранного индекса в древовидной модели - PullRequest
1 голос
/ 27 апреля 2019

У меня есть класс контейнера, который является типом данных в классе treeItem.

Моя древовидная структура работает нормально, но как мне извлечь значение типа данных Контейнер из выбранного элемента.

Так я определил свои функции для данных.

Насколько я понимаю из примера представления QT в виде дерева, мы возвращаем данные в функции Data, которая не может быть объектом, но должна иметь конкретное значение.

class Container
 {
   private:
   std::string stdstrContainerName;
   std::string stdstrPluginType;   
 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 )

class TreeItem
 {
   public:       
       /* Other Functions of the class 
        */
       Container data() const;
       bool setData(const Container &data);

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

       // i wanted to return data from here.

        return QString::fromStdString(item->data().GetName());  // if i 

        //return Container as datatype or return Container as QVariant  than 
        //the tree structure does not work.
       // It only works if i have a concrete value rather that a object.
   }

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

Ответы [ 2 ]

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

Ваше предлагаемое решение - один из способов сделать это.

Критика будет заключаться в том, что она тесно связывает ваш взгляд с вашей моделью.

С другой стороны, любая модель Qt относительно тесно связана с ее представлениями, по крайней мере, относительно интерпретации столбцов, возвращаемых типов данных или иерархии элементов.

Сказав это, и учитывая, что вам нужны только Container::GetType() данные, вы можете сделать еще один способ:

  1. Пусть ваша модель data(QModelIndex index, int role) возвращает результат Container::GetType() для определенного столбца, скажем, index.column()==1. (Вы уже описали, что index.row() указывает желаемый экземпляр Container.)
  2. Ваш метод SumTreeProject::PrintData() должен получить QModelIndex со строкой из treeView->selectionModel()->currentIndex() и столбцом 1, вызвав treeView->model()->index(row, 1).
  3. С этим индексом вы получаете данные из treeView->model()->data(index).toString().

Преимущество этого метода в том, что вам не нужно включать TreeModel.h или Container.h в ваш код SumTreeProject.

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

Я добавил новую функцию в TreeModel.

Container TreeModel::GetContainer(const QModelIndex &index)
 {
    TreeItem *item = getItem(index);
    return (item->data());
 }

Чем преобразовал AbstractModel в TreeModel.

 void SumTreeProject::PrintData()
 {
    QModelIndex index = treeView->selectionModel()->currentIndex();
    QAbstractItemModel *model = treeView->model();
    TreeModel *myModel = qobject_cast<TreeModel*>( model);
    Container cont =  myModel->GetContainer(index);
    qDebug() << cont.GetType().c_str(); // Able to print the value

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...