我在用着QTreeView
向用户显示一些数据。我想要的是将一个实际对象附加到使用表示的每个节点QStandardItem
.
将对象引用保存到QStandardItem
:
QStandardItem *child = new QStandardItem(s);
child->setFlags(child->flags() & ~Qt::ItemIsEditable);
child->setData(QVariant(QVariant::UserType, i), Qt::UserRole + 10);
要在 UI 中单击时访问实际对象:
void MyOtherClass::handleTreeViewSelectionChanged(const QModelIndex &i)
{
MyClass* o = i.data(Qt::UserRole + 10).value<MyClass*>();
// do other stuff with o
}
上面的调用只是返回NULL
。
有人知道如何处理这样的要求吗?
我在网上找不到任何有用的东西。
任何帮助将不胜感激。
要将您的项目存储在 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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)