两个 QStandardItem 对象可以处理同一对象的不同属性吗?

Can two QStandardItem objects handle different attributes from the same object?

我是 Qt Model/View 编程的新手,并且阅读了 Qt 文档中的 Editable Tree Model Example。此示例中的一个很好的功能是单个对象 (TreeItem) 封装了两条信息,这些信息后来显示在包含两列 (namedescription) 的一行中,这要归功于覆盖QModelIndex QAbstractItemModel::indexQVariant QAbstractItemModel::data.

现在,我还有一个自定义 class(例如 Foo),其中包含两条信息(Foo::m_nameFoo::m_description),我想在包含两列的单行,但不是 subclassing QAbstractItemModel 我想 subclass QStandardItemModel 因为它有很多功能。但是,我似乎必须为每个 Foo 对象创建两个 QStandardItem 对象,一个处理 m_name,另一个处理 m_description。如何在内存中保留一个 Foo 对象并让这两个 QStandardItem 对象引用它?

在我的问题中有一个隐含的假设,即必须为每个(行、列)对创建一个 QStandardItem 对象。如果这有误,请告诉我。

QStandardItemModel 就是将数据存储在模型中,因此每个单元格都由一个 QStandardItem 表示,其中包含该单元格的数据。

如果数据已经存储在别处并且不应被复制,那么 QStandardItemModel 是错误的方法,自定义模型是可行的方法。

在派生自 QAbstractItemModel 的树结构的情况下,自定义模型只是视图和数据之间的接口,因此数据仅在内存中驻留一次。

A post in qtcentre suggested Chapter 4 of Advanced Qt Programming 你瞧,有一个关于树子类 QstandardItemModelQStandardIteml 的讨论,其中树的每一行由三个 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;  
  }
}