Присоединить пользовательский объект к QStandardItem в Qt

Я использую QTreeView чтобы показать некоторые данные пользователю. Я хочу прикрепить фактический объект к каждому узлу, представленному с помощью QStandardItem.

сохранить ссылку на объект в QStandardItem:

QStandardItem *child = new QStandardItem(s);
child->setFlags(child->flags() & ~Qt::ItemIsEditable);
child->setData(QVariant(QVariant::UserType, i), Qt::UserRole + 10);

для доступа к фактическому объекту при нажатии на него в пользовательском интерфейсе:

void MyOtherClass::handleTreeViewSelectionChanged(const QModelIndex &i)
{
     MyClass* o = i.data(Qt::UserRole + 10).value<MyClass*>();
     // do other stuff with o
}

вышеупомянутый вызов просто возвращает NULL. Кто-нибудь знает, как справиться с таким требованием?

Я нашел абсолютно ничего полезного в интернете.

любая помощь буду очень признателен.

1 ответов


чтобы сохранить ваш товар В QStandardItem, вам необходимо убедиться, что вы зарегистрировали свой тип в QMetaType. Например, у вас может быть следующее определение:

class MyType
{
public:
    MyType() : m_data(0) {}
    int someMethod() const { return m_data; }

private:
    int m_data;
};

Q_DECLARE_METATYPE(MyType*);  // notice that I've declared this for a POINTER to your type

тогда вы бы хранить его в QVariant, как так:

MyType *object = new MyType;
QVariant variant;
variant.setValue(object);

учитывая должным образом зарегистрированный метатип для вашего типа, теперь вы можете сделать что-то вроде этого с помощью QStandardItems:

MyType *object = new MyType;
QStandardItemModel model;
QStandardItem *parentItem = model.invisibleRootItem();
QStandardItem *item = new QStandardItem;
item->setData(QVariant::fromValue(myType));  // this defaults to Qt::UserRole + 1
parentItem->appendRow(item);

а затем позже извлечь его:

void MyOtherClass::handleTreeViewSelectionChanged(const QModelIndex &i)
{
     MyType* o = i.data(Qt::UserRole + 1).value<MyType*>();
     // do other stuff with o
}