在QT TreeModel中使用自定义数据类型

问题描述 投票:0回答:1

这是我的Container类定义

class Container
{
private:
      std::string stdstrContainerName;
      std::string stdstrPluginType;
      std::string stdstrPluginName;
      int iSegments;
      float fRadius;
public:
    Container();
    explicit Container(std::string strContainerName , std::string 
    strPluginName , std::string strPluginType, int segments , float 
     radius  );
  ~Container();
  std::string GetName();
  std::string GetType();
   void SetName(std::string stdstrName);
};

我希望TreeView的节点将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;
};

我面临的问题是在实现TreeModel函数时。我如何使用Container作为数据类型而不是QVariant。

     QVariant data(const QModelIndex &undex, int role) const override;
     QVariant headerData(int section, Qt::Orientation orientation,
     int role = Qt::DisplayRole) const override;
     bool setData( const QModelIndex &index , const QVariant &value , int 
     role = Qt::EditRole) override;
qt qt5
1个回答
2
投票

你不能使用Container而不是QVariant,但你可以在Container中使用QVariant。看看Q_DECLARE_METATYPE

在声明Container之后将其添加到头文件中:

class Container
{
private:
    // ...
public:
    Container();
    // ...
};

Q_DECLARE_METATYPE(Container); // You only need this once, so here is a good place

创建Container元类型时,可以像这样返回:

QVariant data(const QModelIndex &index, int role) const override {
    TreeItem *item = ...;
    return QVariant::fromValue(item->data());
}

在您的视图中,您可以像这样检索Container

QVariant v = model()->data(index, role);
Container c = v.value<Container>();

请注意,这只能在同一个线程中运行,否则你需要用Container注册qRegisterMetaType(),甚至可以从/向QVariant写一个转换器函数。 但这并不适用于您的情况,因为模型和视图并非设计为存在于不同的线程中。

© www.soinside.com 2019 - 2024. All rights reserved.