使用具有自定义数据的QT树模型
这是容器对象的头文件使用具有自定义数据的QT树模型,qt,qt5,Qt,Qt5,这是容器对象的头文件 class Container { private: std::string stdstrContainerName; std::string stdstrPluginType; int iSegments; float fRadius; public: Container(); Container(std::string , std::string , int , float); Container(co
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;
};
/
树模型的数据函数
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;
}
QVariant树模型::数据(常量QModelIndex&index,int角色)常量
{
如果(!index.isValid())
返回QVariant();
if(角色!=Qt::DisplayRole&&role!=Qt::EditRole)
返回QVariant();
TreeItem*item=getItem(索引);
返回QString::fromStdString(item->data().GetName());
}
bool TreeModel::setData(常量QModelIndex和index,常量QVariant和val,int
(角色)
{
if(角色!=Qt::EditRole)
返回false;
容器c=val.value();
TreeItem*item=getItem(索引);
bool结果=项目->设置数据(c);
如果(结果)
emit dataChanged(索引,索引,{role});
返回结果;
}
我还可以发布项目的任何附加代码。这里缺少的是您视图的代码
QAbstractItemView
派生视图不能单独显示容器
QVariant
s
- 或者您实现视图的方式是
- 解释
s并显示其容器QVariant
GetName()
- 提供一个编辑器,可以操作
s容器QVariant
- 解释
- 或(更简单的方法)将固结层移动到模型中,然后
- 返回
,item->GetName()
,具体取决于->GetType()
和role
index.column()
- 从传入的文本操作
QVariant val
- 返回
data()
函数看起来怎么样?@vahancho我已经用树模型数据函数更新了代码。我认为你应该从你的容器
对象返回具体的数据,而不是将它转换成QVariant
,即返回QString::fromStdString(item->data().GetName())
在setData()
中,您应该从该值构造一个容器
对象,并将其设置为树项目。您需要从所选行获取模型索引,然后从树模型中通过该索引获取树项目,并从树项目获取其容器。我已经能够使树模型工作,但是,如何从树状视图中的选定行检索容器对象
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;
}