crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 10.7.2025, 1:46