在Qt中将自定义对象附加到QStandardItem

use*_*er1 8 c++ qt qt4

我正在使用QTreeView向用户显示一些数据.我想要的是将实际对象附加到使用表示的每个节点QStandardItem.

要将对象引用保存到QStandardItem:

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

要在UI中单击它时访问实际对象:

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

上面的调用只是返回NULL.有谁知道如何处理这样的要求?

我在网上发现绝对没用.

任何帮助将受到高度赞赏.

小智 7

要将项目存储在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
Run Code Online (Sandbox Code Playgroud)

然后你将它存储到像这样的QVariant:

MyType *object = new MyType;
QVariant variant;
variant.setValue(object);
Run Code Online (Sandbox Code Playgroud)

如果为您的类型正确注册了元类型,您现在可以使用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);
Run Code Online (Sandbox Code Playgroud)

然后提取它:

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