这是我的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;
你不能使用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
写一个转换器函数。
但这并不适用于您的情况,因为模型和视图并非设计为存在于不同的线程中。