PDA

View Full Version : how to use custom type items in QTreeWidget?



jackal
4th March 2011, 11:23
I'm trying to use custom items in QTreeWidget. e.g:


#include <QTreeWidgetItem>
#include "unit.h" // header with any class

class tree_item : public QTreeWidgetItem
{
public:
tree_item(unit *object);

unit *object() const;
// ...
};




#include "tree_item.h"

tree_item::tree_item(unit *object)
: QTreeWidgetItem(SOME_USER_TYPE)
{
setText(0, *(object->name()));
}

// ...



I can add my custom item to a QTreeWidget. But when I'm trying to get it back, tree is returning item of type QTreeWidgetItem.. In short, I'm loosing data




// ...

QTreeWidget *tree = new QTreeWidget();
tree_item *item = new tree_item(new unit(10, 12));
tree->addTopLevelItem(item);

// ...



This part of code works properly, I can see my object's name in column 0. But if I use,
for example: tree->itemAt(some_point) of course it gives me item of type QTreeWidgetItem* not tree_item*

Can someone give me ideas? (If possible, without inheriting QTreeWidget)

Thanks in advance

Berryblue031
4th March 2011, 11:43
To store custom data in QTreeWidgetItem you should use the setData function


QTreeWidgetItem* item = new QTreeWidgetItem();
QVariant somedata;
item->setData(0, Qt::UserRole + 1, somedata);

You can then retrieve it with


item->data(0, 0, Qt::UserRole + 1);

Or create your items with a user type
and after calling itemAt check the type and cast the object


QTreeWidgetItem* item = new CustomItem(mTreeWidget, SOME_USER_TYPE);
...
QTreeWidgetItem* item = mTreeWidget->itemAt(some_point);
if(item->type() == SOME_USER_TYPE)
{
CustomItem* customitem = static_cast<CustomItem*>(item);
}

jackal
4th March 2011, 13:05
I don't think the version with QVariant will work in my case, but static_cast is an excellent solution for me! Thanks a lot!