0

我是 Qt 模型/视图编程的新手,并已阅读 Qt 文档中的可编辑树模型示例。此示例中的好功能是单个对象 ( ) 封装了两条信息,这些信息随后显示在包含两列 ( and )TreeItem的单行中,这要归功于and的覆盖。namedescriptionQModelIndex QAbstractItemModel::indexQVariant QAbstractItemModel::data

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

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

4

2 回答 2

0

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

如果数据已经存储在其他地方并且不应该被复制,那么这QStandardItemModel是错误的方法,定制模型是要走的路。

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

于 2017-02-22T08:22:55.847 回答
0

qtcentre 中的一篇文章建议了Advanced Qt Programming的第 4 章,你瞧,这里讨论了树的子类化QstandardItemModelQStandardIteml树的每一行由三个QstandardItem处理单个对象的不同属性组成。实现源代码免费提供

基本上,一个有:

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;  
  }
}
于 2017-02-22T22:32:02.847 回答