Могут ли два объекта QStandardItem обрабатывать разные атрибуты одного и того же объекта?

Я новичок в программировании моделей / представлений Qt и прочитал пример модели редактируемого дерева в документации Qt. Приятной особенностью в этом примере является то, что один объект (TreeItem) инкапсулирует две части информации, которые затем отображаются в одной строке, содержащей два столбца (name а также description) благодаря переопределению QModelIndex QAbstractItemModel::index а также QVariant QAbstractItemModel::data,

Теперь у меня также есть собственный класс (например, Foo) содержащий две части информации (Foo::m_name а также Foo::m_description) что я хочу отобразить в одной строке, содержащей два столбца, но вместо подклассов QAbstractItemModel Я хочу подкласс QStandardItemModel потому что он имеет много функциональности. Тем не менее, кажется, я должен создать два QStandardItem объекты для каждого из моих Foo объекты, один для обработки m_name и другой, чтобы справиться m_description, Как я могу сохранить один Foo объект в памяти и эти два QStandardItem объекты ссылаются на это?

В моем вопросе есть неявное предположение, что нужно создать QStandardItem объект для каждой пары (строка, столбец). Пожалуйста, дайте мне знать, если это не так.

2 ответа

Решение

В посте в qtcentre предложена глава 4 Расширенного программирования на Qt, и вот, есть обсуждение подклассов дерева QstandardItemModel а также QStandardIteml где каждый ряд дерева состоит из трех 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;  
  }
}

QStandardItemModel все о хранении данных в модели, поэтому каждая ячейка представлена QStandardItem который содержит данные этой ячейки.

Если данные уже хранятся в другом месте и не должны дублироваться, то QStandardItemModel это неправильный подход, и нестандартная модель - это путь.

Пользовательская модель, в случае древовидной структуры, полученной из QAbstractItemModel, это просто интерфейс между представлением и данными, поэтому данные хранятся только один раз в памяти.

Другие вопросы по тегам