从树模型中的选定索引中检索值

时间:2019-04-27 10:27:41

标签: qt qt5

我有一个容器类,它是treeItem类中的数据类型。

我的树结构工作正常,但是如何从所选项目中检索Container数据类型的值。

这就是我定义数据功能的方式。

就我在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 个答案:

答案 0 :(得分:1)

我在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

}

答案 1 :(得分:1)

您提出的解决方案是实现这一目标的一种方法。

批评是它会将您的观点与模型紧密联系在一起。

另一方面,任何Qt模型都与其视图紧密相关,至少在列的解释,返回的数据类型或项目层次方面。

已经说了这一点,并且考虑到您只需要Semaphore sem; bool createdSystemWideSem; sem = new Semaphore(0, 1, "sem1", out createdSystemWideSem); if (!createdSystemWideSem) { sem = Semaphore.OpenExisting("sem1"); } 数据,另一种做您想要做的方法是:

  1. 让模型的Container::GetType()函数返回特定列的data(QModelIndex index, int role)结果,例如Container::GetType()。 (您已经描述过index.column()==1指定了所需的index.row()实例。)
  2. 您的Container方法需要通过调用SumTreeProject::PrintData()从行QModelIndex和列1中获得treeView->selectionModel()->currentIndex()
  3. 使用此索引,您可以从treeView->model()->index(row, 1)获取数据。

此方法的优点是您无需在treeView->model()->data(index).toString()代码中包含TreeModel.hContainer.h