Могут ли два объекта 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
, это просто интерфейс между представлением и данными, поэтому данные хранятся только один раз в памяти.