2017-02-22 99 views
0

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

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

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

ответ

0

A post in qtcentre предложил главе 4 Advanced Qt Programming и вот, есть обсуждение дерева subsclassing QstandardItemModel и QStandardIteml где каждая строка дерева состоит из трех 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; 
    } 
} 
0

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

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

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

+0

я объявил 'Q_DECLARE_METATYPE (Foo *) 'и сохранил' QVariant 'в' QStandardItem', чтобы избежать хранения объекта 'Foo'. Тем не менее, это все равно привело к созданию двух объектов 'QStandardItem' для каждого объекта Foo, и я надеялся, что существует некоторое решение для решения проблемы. – jmborr

+0

Как я уже сказал, «QStandardItemModel» использует один «QStandardItem» для каждой ячейки в качестве своего принципа проектирования. Его вариант использования - хранить данные в модели, а не быть интерфейсом к данным, хранящимся в другом месте. –