crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Модель-представление, как создавать свои модели.
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Tonal Дата 10.7.2008, 14:09
 
Цитата(vinnipux @ 10.7.2008, 14:30) *
...Мне видится так решение проблемы...

Парасить запрос не надо - довольно дорогое удовольствие.
Отдать серверу на препарацию, и от него узнать, сколько и каких полей будет в результате.

Дальше всё зависит от набора операций для курсора.
Бывает, что после выполнения запроса сразу известны количество строк, и курсор позволяет перемещатся в обе стороны и в указанную позицию или row_id. Тогда у тебя будет либо прямое соответствие ModelIndex.row <-> номер строки, либо по row_id, запихнутому в internalPointer.
Т.е. в data просто позиционируешься на нужную строку, и отдаёшь запрошенную колонку.

А если курсор этого не позволяет, тогда придётся руками кешировать данные.
Т.е. создавать массив структур, наполнять их по мере надобности, и отдавать данные в data уже из них.

Ну и нужно стремится как можно меньше данных с сервера тянуть и в гридах на пользователей вываливать.
Всё равно они ему больше 10-20 строк не нужны. :)
vinnipux Дата 10.7.2008, 13:40
 
Цитата(Red Devil @ 10.7.2008, 16:15) *
Цитата
Вы правы структуру действительно придется создавать. но мне доконца не ясен вопрос, как связать структуру с indexModel. Мне видится так решение проблемы. Парасить запрос, и на основании разбора делать вывод сколько полей он вернет, если в селекте стоит * то сделать запрос к БД, и узнать сколько полей имеется у таблицы. Далее на основании количества полей строить класс-контейнер, и создавать массив из таких класов, куда заносить результат запроса. row-номер строки (индекс массива), column - поле в ячейке, элемент класса-контейнера. Вопрос в том может как-то проще можно написать? и как связать с индексами модели.

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

наверное я тормоз. данные разделы в указанных книгах, переводы на данном сайте прочитал на несколько раз, и все не могу врубится. как происходит связь QModelIndex с источником данных, как работает функция CrteateIndex(). Допусти я создал вектор содержащий в каждой ячейке строку результат БД. как писал ранее row это номер ячейки в векторе, а column - поле в классе контейнере. как будут генерится индексы, этого не могу понять. надо переписывать CreateIndex()? Если вам нетрудно вышлите пример, работы с моделями. Желательно таблицами.
Red Devil Дата 10.7.2008, 12:15
 
Цитата
Вы правы структуру действительно придется создавать. но мне доконца не ясен вопрос, как связать структуру с indexModel. Мне видится так решение проблемы. Парасить запрос, и на основании разбора делать вывод сколько полей он вернет, если в селекте стоит * то сделать запрос к БД, и узнать сколько полей имеется у таблицы. Далее на основании количества полей строить класс-контейнер, и создавать массив из таких класов, куда заносить результат запроса. row-номер строки (индекс массива), column - поле в ячейке, элемент класса-контейнера. Вопрос в том может как-то проще можно написать? и как связать с индексами модели.

Вот именно поэтому и прочитай про это в книгах. Там это описано подробно, как и что перезагружать, от чего наследоватся и как связывать модель и представление. Просто все это в посте описать трудно, да и зачем, когда все это в книгах лучше описано.
vinnipux Дата 10.7.2008, 10:30
 
Цитата(Red Devil @ 10.7.2008, 13:27) *
examples/itemviews

Советую вначале в книгах по Qt4 (Шлее и еще кто-то автора забыл, в электронном виде книги найти можно) про модели прочитать, система нестаднартная и требует чтобы мозги к ней привыкли, ей нужно уметь думать, чтобы реализовать то что нужно.

Вообще она изначально расчитана на то, что данные можно представлять в разных видов. Естественно на это накладываются некоторые ограничения. Например, если нужно сделать очень специфическую модель для представления данных, где память и данные контроллирует сам программист (т.е. избежания лишниго копирования элементов), то тут эти модели все портят и заставляют извращатся ни по-детски.

В общем - мне эти модели не очень понравились, потому что они заставляют меня делать (писать код) то что мне не нужно, а пользы мне от этого никакой. Естественно это в моем случае, а не во всех.

спасибо за совет.
Вы правы структуру действительно придется создавать. но мне доконца не ясен вопрос, как связать структуру с indexModel. Мне видится так решение проблемы. Парасить запрос, и на основании разбора делать вывод сколько полей он вернет, если в селекте стоит * то сделать запрос к БД, и узнать сколько полей имеется у таблицы. Далее на основании количества полей строить класс-контейнер, и создавать массив из таких класов, куда заносить результат запроса. row-номер строки (индекс массива), column - поле в ячейке, элемент класса-контейнера. Вопрос в том может как-то проще можно написать? и как связать с индексами модели.

а ансчет писать, я вот хочу сделать один раз а потом как библиотеку, или просто файл подключать к новому проекту и использовать. Поэтому можно сначало и пописать, гнлавное что бы получилось макисмально универсально и работало быстро.
Red Devil Дата 10.7.2008, 9:27
  examples/itemviews

Советую вначале в книгах по Qt4 (Шлее и еще кто-то автора забыл, в электронном виде книги найти можно) про модели прочитать, система нестаднартная и требует чтобы мозги к ней привыкли, ей нужно уметь думать, чтобы реализовать то что нужно.

Вообще она изначально расчитана на то, что данные можно представлять в разных видов. Естественно на это накладываются некоторые ограничения. Например, если нужно сделать очень специфическую модель для представления данных, где память и данные контроллирует сам программист (т.е. избежания лишниго копирования элементов), то тут эти модели все портят и заставляют извращатся ни по-детски.

В общем - мне эти модели не очень понравились, потому что они заставляют меня делать (писать код) то что мне не нужно, а пользы мне от этого никакой. Естественно это в моем случае, а не во всех.
vinnipux Дата 10.7.2008, 8:51
 
Цитата(AD @ 10.7.2008, 12:17) *
Сам недавно этим вопросом тоже стал заниматься. Насколько я понимаю, для реализации тестового примера вполне достаточно QSqlTableModel, QAbstractItemModel следует применять, если ты хочешь сделать более тонкое управление поведением модели. Для отображения можно использовать как и QTableWidget, так и QTableView!!!


Представление отображает только те данные, которые видны на экране. Судя по твоей БД, лучше для представления использовать QTableView!

QSqlTableModel не совсем подойдет, как я понимаю он предназначен для работы с Qt-ными средствами доступа к БД.

Цитата(void* @ 10.7.2008, 12:22) *
1) "перегрузить" и переписать - несколько разные понятия, тебе нужно будет именно переписать, т.к. это виртуальные функции
2) в %QTDIR%/examples насколько я знаю куча примеров на эту тему

1) спасибо что поправили.
2) если не трудно вы немогли бы указать имена примеров, где вы увидили примеры на эту тему?
void* Дата 10.7.2008, 8:22
  1) "перегрузить" и переписать - несколько разные понятия, тебе нужно будет именно переписать, т.к. это виртуальные функции
2) в %QTDIR%/examples насколько я знаю куча примеров на эту тему
AD Дата 10.7.2008, 8:17
  Сам недавно этим вопросом тоже стал заниматься. Насколько я понимаю, для реализации тестового примера вполне достаточно QSqlTableModel, QAbstractItemModel следует применять, если ты хочешь сделать более тонкое управление поведением модели. Для отображения можно использовать как и QTableWidget, так и QTableView!!!


Представление отображает только те данные, которые видны на экране. Судя по твоей БД, лучше для представления использовать QTableView!
vinnipux Дата 10.7.2008, 8:07
  Доброе время суток.
Встала задача разработать приложение работающие с БД. Операционная система Windows ХР среда разработки Eclipse Europe + Qt4 (open_sourse) + MinGW.
Для соединения с БД была выбрана библиотека OTL(OCCI и OCI так и не смог осилить), пришлось попарится, но вроде разобрался как работать с ней. И теперь встал вопрос как выводить данные получаемы от БД. В Qt4 реализована концепция модель-представление, как я понял модель отвечает за доступ к данным через стандартный интерфейс, представление отображает данные. И вот вопрос как написать модель? Ясно что необходимо использовать класс QAbstractItemModel. Необходимо будет перегрузить функции data(),rowCount(), columnCount(). Но мне не ясно как быть с indexModel. как они будут создаваться и описывается. ведь источником данных для модели будет otl_stream что представляет из себя как я понимаю однонаправленный курсор, перемещение по которому возможно только в одном направлении. Честно сказать не совсем понятен процесс взаимодействия модели и представления. То есть представление отображает все данные которые есть в модели (допустим селект вернул 500 тысяч строк), или только часть которую видно на дисплее, а остальные данные подгружает по мере необходимости (перемещения по представлению вниз). Далее для каждого столбца в модели данных создается index, так как otl_stream однонаправлен, где будут хранится данные уже выбранных данных? Или необходимо создавать в модели структуру в которую загружать результат выборки, и уже из этой структуры передавать данные представлению. Или просто искользовать QTableWidget.
Может, кто сталкивался с проблемой вывода данных на экран, и может поделиться опытом, примерами, дать совет, или разъяснить, что я не так понимаю, буду очень благодарен.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 20.4.2025, 21:52