Название: vector of structs and QAbstractTableModel Отправлено: UVV от Март 27, 2009, 10:29 Воспользовавшись поиском, обнаружил, что на эту тему люди задают вопросы в этот раздел, хотя я и не понимаю почему =)
Вопрос в следующем. Допустим есть vector addrSeq структур: Код: struct myStruct Пока не придумал ничего интереснее чем: Код: int myModel::columnCount(const QModelIndex &parent) const Как бы вы посоветовали реализовать такое более грамотно? Название: Re: vector of structs and QAbstractTableModel Отправлено: Barmaglodd от Март 27, 2009, 11:23 Я также делаю.
Название: Re: vector of structs and QAbstractTableModel Отправлено: UVV от Март 27, 2009, 12:58 Я также делаю. Т.е. получается под каждую структуру свою модель? =)Название: Re: vector of structs and QAbstractTableModel Отправлено: Racheengel от Март 27, 2009, 13:00 разве что
Код: struct myStruct desc = addrSeq[index.row()]; Код: const struct myStruct& desc = addrSeq[index.row()]; чтобы лишний раз не делать копирование структур (будет пошустрее) Название: Re: vector of structs and QAbstractTableModel Отправлено: Racheengel от Март 27, 2009, 13:01 Я также делаю. Т.е. получается под каждую структуру свою модель? =)Что значит "под каждую структуру свою модель" ? Название: Re: vector of structs and QAbstractTableModel Отправлено: UVV от Март 27, 2009, 13:13 Что значит "под каждую структуру свою модель" ? Это значит, что вектор не один, а их много и они все с разными структурами))Название: Re: vector of structs and QAbstractTableModel Отправлено: Racheengel от Март 27, 2009, 13:16 Тогда передавай его в конструктор модели по поинтеру.
А в модели используй поинтер. Название: Re: vector of structs and QAbstractTableModel Отправлено: UVV от Март 27, 2009, 13:20 Тогда передавай его в конструктор модели по поинтеру. А в модели используй поинтер. Я говорю вот об этом: Код: switch (index.column()) Для каждой структуры придётся делать свою модель, где вот этот фрагмент будет отличаться. Т.е. для структуры myStruct2 модель должна быть уже другой. Код: struct myStruct1 Название: Re: vector of structs and QAbstractTableModel Отправлено: Racheengel от Март 27, 2009, 13:55 можно конечно и свою модель, а можно делегаты разные сделать в зависимости от типа структур.
Название: Re: vector of structs and QAbstractTableModel Отправлено: Barmaglodd от Март 27, 2009, 13:56 Да, для каждой структуры своя модель. Если поля интегральных типов и строки, можно сделать функцию, которая конвертирует структуру в массив QVariant'ов, и передавать их в модель, тогда класс модели будет один. Либо сделать интерфейс, который позволяет получить по индексу QVariant c представлением данного поля, и наследников от него - конкретные реализации для каждого класса структур. Либо сделай для каждого класса структур что-то типа type_traits с информацией о полях и их типе, и используй шаблонного наследника от QAbstractItemModel. Наверно можно ещё кучу вариантов придумать.
Название: Re: vector of structs and QAbstractTableModel Отправлено: Sergeich от Март 30, 2009, 02:38 Либо сделай для каждого класса структур что-то типа type_traits с информацией о полях и их типе, и используй шаблонного наследника от QAbstractItemModel. При использовании шаблонного наследника от QAbstractItemModel могут возникнуть проблемы, т.к. moc не поддерживает шаблоны в наследниках QObject, лучше использовать абстрактный интерфейс для получения данных из вектора, а в его реализации использовать шаблоны.Например, надо построить модель для вектора из трехмерных точек QVector<Point3D>: В структуру Point3D добавляем метод для получения координаты по индексу и два статических метода для получения числа элементов структуры и названий элементов Код: struct Point3D Код: class AbstractTableData Код: template <class T> Код: class TableModel : public QAbstractTableModel Код: int main( int argc, char** argv ) Название: Re: vector of structs and QAbstractTableModel Отправлено: Barmaglodd от Март 30, 2009, 08:23 При использовании шаблонного наследника от QAbstractItemModel могут возникнуть проблемы, т.к. moc не поддерживает шаблоны в наследниках QObject, лучше использовать абстрактный интерфейс для получения данных из вектора, а в его реализации использовать шаблоны. Всё зависит от того, как вы этого наследника будете использовать ;)http://doc.trolltech.com/qq/qq15-academic.html (http://doc.trolltech.com/qq/qq15-academic.html) |