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

问题描述:

我是Qt模型/视图编程的新手,并已阅读Qt文档中的Editable Tree Model Example。此示例中的一个很好的功能是,由于重写了QModelIndex QAbstractItemModel::indexQVariant QAbstractItemModel::data,单个对象(TreeItem)封装了后面显示在包含两列(namedescription)的单行中的两条信息。现在两个QStandardItem对象可以处理来自同一个对象的不同属性吗?

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

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

A post in qtcentre建议Advanced Qt Programming和LO的第4章,不料,有一棵树subsclassing 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; 
    } 
} 

QStandardItemModel是关于将数据存储在模型中的,所以每个单元都由包含该单元数据的QStandardItem表示。

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

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

+0

我宣布'Q_DECLARE_METATYPE(富* )并在'QStandardItem'中存储'QVariant '以避免存储'Foo'对象。然而,这仍然使我不必实例两个'QStandardItem'对象为每个'Foo'对象,我希望有一些设计上的解决方法。 – jmborr

+0

正如我说:'在使用QStandardItemModel'每单元一个'QStandardItem'作为其设计原则。它的用例是将数据存储在模型中,而不是作为存储在别处的数据的接口。 –