【问题标题】:Can two QStandardItem objects handle different attributes from the same object?两个 QStandardItem 对象可以处理来自同一对象的不同属性吗?
【发布时间】:2025-12-02 09:30:02
【问题描述】:

我是 Qt 模型/视图编程的新手,并已阅读 Qt 文档中的Editable Tree Model Example。此示例中的好功能是单个对象 (TreeItem) 封装了两条信息,这些信息随后显示在包含两列(namedescription)的单行中,这要归功于覆盖 QModelIndex QAbstractItemModel::index 和 @ 987654326@.

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

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

【问题讨论】:

    标签: qt qstandarditemmodel qstandarditem


    【解决方案1】:

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

    如果数据已经存储在其他地方并且不应重复,那么QStandardItemModel 是错误的方法,而自定义模型是可行的方法。

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

    【讨论】:

    • 我已经声明了Q_DECLARE_METATYPE(Foo *) 并在QStandardItem 中存储了一个QVariant<Foo *> 以避免存储Foo 对象。然而,这仍然导致我不得不为每个 Foo 对象实例化两个 QStandardItem 对象,我希望有一些设计解决方法。
    • 正如我所说:QStandardItemModel 使用每个单元格一个QStandardItem 作为其设计原则。它的用例是将数据存储在模型中,而不是作为存储在其他地方的数据的接口。
    【解决方案2】:

    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;  
      }
    }
    

    【讨论】:

      最近更新 更多