Russian Qt Forum
Ноябрь 01, 2024, 04:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Адаптер контейнеров (QList, QMap и т.д) к моделям (QAbstractItemView)  (Прочитано 3937 раз)
_KoT_
Гость
« : Февраль 20, 2011, 15:47 »

Иногда возникает необходимость вывести значения контейнера в какой нибудь ...View. Пробежаться циклом не сложно, а если надо дать возможность редактировать, уже сложнее. Решил сделать нечто универсальное — набор моделей-адаптеров использующих для хранения информации переданный при создании указатель на контейнер:
MyMapModelKeysToHeaders — Обвязка вокруг QMap. Значения в колонку(строку), ключи в вертикальный(горизонтальный) заголовок. (Сделан)
MyMapModelKeysToColumn — Обвязка вокруг QMap. Ключи в первый столбец(строку), значения во второй столбец(строку). (Сделан)
MyListModel — Обвязка вокруг QList. Значения в колонку(строку). (В работе)
MyLinkedListModel — Обвязка вокруг QLinkedList. Значения в колонку(строку). (В работе)
MyVectorModel — Обвязка вокруг QVector. Значения в колонку(строку). (В работе)

http://code.google.com/p/qt-containers-to-models/

MyMapModelKeysToHeaders
Модель-адаптер вокруг QMap. Ключ в заголовке, значения в таблице.
http://qt-containers-to-models.googlecode.com/svn/trunk/MyMapModel/src/mymapmodelkeystoheader.h
http://qt-containers-to-models.googlecode.com/svn/trunk/MyMapModel/src/mymapmodelkeystocolumn.cpp
http://qt-containers-to-models.googlecode.com/svn/trunk/MyMapModel/src/mymapcontainer.h
http://qt-containers-to-models.googlecode.com/svn/trunk/MyMapModel/src/myabstractmapcontainer.h
Позволяет связать наследников QAbstractItemView и QMap. Получает указатель на объект QMap и использует его для хранения данных. Из-за того, что макрос Q_OBJECT конфликтует с шаблонами, указатель на QMap необходимо помещать во внутренний адаптер. MyAbstractMapContainer — не шаблонизированный абстрактный адаптер, видимый в наследнике QAbstractItemModel. MyMapContainer — шаблонизированный наследник MyAbstractMapContainer содержащий указатель на QMap.
Пример использования:
Код:
...
private:
QMap<QChar, int> * map;
MyAbstractMapContainer *mc;
MyMapModelKeysToHeaders * model;
...
mc = new MyMapContainer<QChar, int>(map));
model = new MyMapModelKeysToHeaders(mc, this))
tableView->setModel(model);

Не сделал добавление новых элементов через модель — не придумал какие значения ключа выставлять. Есть идеи?

MyMapModelKeysToColumn
Модель-адаптер вокруг QMap. Ключ в первом столбце(строке), значеия во втором столбце(строке).
http://qt-containers-to-models.googlecode.com/svn/trunk/MyMapModel/src/mymapmodelkeystocolumn.h
http://qt-containers-to-models.googlecode.com/svn/trunk/MyMapModel/src/mymapmodelkeystocolumn.cpp
http://qt-containers-to-models.googlecode.com/svn/trunk/MyMapModel/src/mymapcontainer.h
http://qt-containers-to-models.googlecode.com/svn/trunk/MyMapModel/src/myabstractmapcontainer.h
Позволяет связать наследников QAbstractItemView и QMap. Получает указатель на объект QMap и использует его для хранения данных. Из-за того, что макрос Q_OBJECT конфликтует с шаблонами, указатель на QMap необходимо помещать во внутренний адаптер. MyAbstractMapContainer — не шаблонизированный абстрактный адаптер, видимый в наследнике QAbstractItemModel. MyMapContainer — шаблонизированный наследник MyAbstractMapContainer содержащий указатель на QMap.
Пример использования:
Код:
...
private:
QMap<QChar, int> * map;
MyAbstractMapContainer *mc;
MyMapModelKeysToColumn * model;
...
mc = new MyMapContainer<QChar, int>(map));
model = new MyMapModelKeysToColumn(mc, this))
tableView->setModel(model);



Может у кого есть идеи как проще(без внутреннего адаптера) обойти конфликт шаблона и Q_OBJECT?



Принимаются замечания, пожелания, конструктивная критика. Если кто захочет присоединится к написанию буду только рад)
« Последнее редактирование: Февраль 21, 2011, 16:55 от _KoT_ » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 21.