我是使用Qt的Model / View编程的新手,并阅读了Qt文档中的source code。此示例中的一个很好的功能是,单个对象(TreeItem
)封装了两条信息,这些信息稍后显示在包含两列(name
和description
)的单行中,这要归功于覆盖QModelIndex QAbstractItemModel::index
和QVariant QAbstractItemModel::data
。
现在,我还有一个自定义类(例如Foo
),其中包含两条信息(Foo::m_name
和Foo::m_description
),我希望在包含两列的单行中显示这些信息但不是子类化QAbstractItemModel
我想要子类QStandardItemModel
,因为它有一些功能。但是,似乎我必须为每个QStandardItem
对象创建两个Foo
个对象,一个用于处理m_name
,另一个用于处理m_description
。如何在内存中保留一个Foo
对象并让这两个QStandardItem
对象引用它?
在我的问题中,隐含的假设是必须为每个(行,列)对创建一个QStandardItem
对象。如果这是错误的,请告诉我。
答案 0 :(得分:0)
A post in qtcentre建议Advanced Qt Programming的第4章,并且看到有关于QstandardItemModel
和QStandardIteml
子类的树的讨论,其中树的每一行都是由三个QstandardItem
处理单个对象的不同属性组成。
实现源代码为freely available
基本上,有人:
class myItem : public QStandardItem {
public:
myItem(Foo &afoo) : QStandardItem(afoo.getName()), m_foo(afoo) {
m_description = new QStandardItem(afoo.getDescription());
}
QstandardItem *m_description; // display m_description
private:
Foo &m_foo;
};
然后我们在模型树中插入一行两个QstandardItem
class myModel: public QStandardItemModel {
StandardItem *myModel::appendRow(QStandardItem *parent, Foo &afoo)
{
auto *doublet = new myItem(afoo);
parent->appendRow(QList<QStandardItem*>() << doublet
<< double->m_description);
return nameItem;
}
}