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

时间:2017-02-22 00:07:02

标签: qt qstandarditemmodel qstandarditem

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

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

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

1 个答案:

答案 0 :(得分:0)

A post in qtcentre建议Advanced Qt Programming的第4章,并且看到有关于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;  
  }
}