Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: _KoT_ от Февраль 20, 2011, 15:47



Название: Адаптер контейнеров (QList, QMap и т.д) к моделям (QAbstractItemView)
Отправлено: _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/ (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/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/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/mymapcontainer.h)
http://qt-containers-to-models.googlecode.com/svn/trunk/MyMapModel/src/myabstractmapcontainer.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.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/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/mymapcontainer.h)
http://qt-containers-to-models.googlecode.com/svn/trunk/MyMapModel/src/myabstractmapcontainer.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?



Принимаются замечания, пожелания, конструктивная критика. Если кто захочет присоединится к написанию буду только рад)