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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: [QSqlQueryModel] редактируемый  (Прочитано 19976 раз)
Troglodit
Гость
« : Март 15, 2010, 12:06 »

QT 4.6.1.
Сделал как в доке, т.е. переопределил методы  setData() и flags(). Далее модель соединяется с QTableView. При этом после изменения поля, в бд поле изменяется, а в программе остается старое значение. Следующая доработка это исправила, а именно, после каждого обновления выполнялся медод setQuery который возвращал ВЕСЬ набор данных, но при этом фокус становился на первую строку,что также не есть гуд. Получается что если в запросе участвуют серьезные вычисления, то каждый UPDATE будет очень сильно тормозить.
QSqlTableModel не подходит, потому что зачастую редактировать только одну таблицу не имеет смысла или условия для отбора редактируемых данных зависят от других таблиц.
Может есть другой путь, а я что-то делаю криво или в qt посто недопилили стандартные классы для работы с бд?
Записан
asvil
Гость
« Ответ #1 : Март 15, 2010, 21:40 »

Для удобной работы нужно самому релизовывать модель. А если быть оптимальнее, то скопировать код QSqlTableModel и изменить необходимые методы на более оптимизированные в плане sql запросов. Однако если мне не изменяет память реализация Sql*Model хранит данные модели в QSqlQuery и при запросах представлений просто делает QSqlQuery::seek(). Это начит setData не получиться, так как QSqlQuery не поволяет менять данные внутри себя. И из всего вышеперечисленного вывод - qt sql модели скорее представляют макеты, чем компоненты приложения для боевого использования.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #2 : Март 16, 2010, 01:09 »

Цитировать
При этом после изменения поля, в бд поле изменяется, а в программе остается старое значение.
Как такое возможно? Как оно изменяется в БД но не меняется в программе - можно подробнее? Вы вводите в ячейку новый текст а он остается старым?

Цитировать
Следующая доработка это исправила, а именно, после каждого обновления выполнялся медод setQuery который возвращал ВЕСЬ набор данных, но при этом фокус становился на первую строку,что также не есть гуд
Да не гуд т.к. подход неверный. Модель должна кешировать в себе изменения полученнные от пользователя, и вносить изменения в БД по команде Commit. Например когда окно "Справочника" закрывается. Смотрите политику OnManualSubmit.

Цитировать
QSqlTableModel не подходит, потому что зачастую редактировать только одну таблицу не имеет смысла или условия для отбора редактируемых данных зависят от других таблиц.
Может есть другой путь, а я что-то делаю криво или в qt посто недопилили стандартные классы для работы с бд?
Да в Qt нет стандартных решение похожих на FIBQuery из Делфи - их действительно не хватает, чтобы можно было вписать тексты запросов SelectSQL, InsertSQL, UpdateSQL и оно работало и корректно отображалось в TableView. Но мне кажется реализовать похожие классы с использованием системы моделей Qt не проблема, просто надо сесть разобраться и сделать это. Сам SQL из Qt использую но пока обходился стандартными решениями т.к. программа над которой работаю сейчас лишь использует БД второстепенно а не полноценная "БД программа".

Цитировать
Для удобной работы нужно самому релизовывать модель.
согласен
Цитировать
А если быть оптимальнее, то скопировать код QSqlTableModel и изменить необходимые методы на более оптимизированные в плане sql запросов.
несогласен - зачем копировать исходники другого класса? Если наш "реализован посредством" - то наследуем, "если использует" - то агрегируем, и что там в SQL запросах от QSqlTableModel можно оптимизировать??? Менять нужно интерфейс и набор ф-сти, а узким местом работы является скорость БД а не промежуточных компонент типа QSqlTableModel.

Цитировать
Однако если мне не изменяет память реализация Sql*Model хранит данные модели в QSqlQuery и при запросах представлений просто делает QSqlQuery::seek(). Это начит setData не получиться, так как QSqlQuery не поволяет менять данные внутри себя.
есть QSqlQueryModel - он только для чтения
есть QSqlTableModel - он наследник QSqlQueryModel и при этом он Чтение-Запись - а из ваших рассуждений это невозможно...

Цитировать
И из всего вышеперечисленного вывод - qt sql модели скорее представляют макеты, чем компоненты приложения для боевого использования.
У меня другой вывод - qt sql модели - базовое АПИ для создания более продвинутых компонент БД по аналогии с FIBc и т.д.
Также как и базовые драйверы Qt для БД много чего не поддерживают - а вот их альтернативная реализация уже сильнее (в сравнение драйвер ibase от ax ax со стандартным из Qt), ,благодаря тому что разработчики Qt сделали достаточный для внесения новых фич АПИ.
Записан
Troglodit
Гость
« Ответ #3 : Март 16, 2010, 10:53 »

Цитировать
Как такое возможно? Как оно изменяется в БД но не меняется в программе - можно подробнее? Вы вводите в ячейку новый текст а он остается старым?
очень просто. после ввода значения в ячейку и ПОДТВЕРЖДЕНИЕ, значение на экране меняется на старое, т.е. в модели обновление рекорда не происходит,а в базе изменяется потому что вызывается setData().
Цитировать
Смотрите политику OnManualSubmit.
Если мне память не изменяет, то это только для QSqlTableModel.
Цитировать
Да в Qt нет стандартных решение похожих на FIBQuery из Делфи - их действительно не хватает, чтобы можно было вписать тексты запросов SelectSQL, InsertSQL, UpdateSQL и оно работало и корректно отображалось в TableView. Но мне кажется реализовать похожие классы с использованием системы моделей Qt не проблема, просто надо сесть разобраться и сделать это. Сам SQL из Qt использую но пока обходился стандартными решениями т.к. программа над которой работаю сейчас лишь использует БД второстепенно а не полноценная "БД программа".
В тех же делфи не толко в фиб -это стандарт. Так же как и во многих других языках. Для моих целей нужна именно полноценная работа с БД и гуи, нужен готовый велосипед, допилить его до свих нужд -это вопрос второй. Вообще судя по программам на qt-apps каждый выдумывал в БД-ориентированных программах кто в лес кто по дрова, да и программ этих не много. У меня сложилось впечатление, что троли развивают толко то, что пригодиться только в коммуникаторах, а уже потом в остальном. Зачем было делать костыли и называть это полноценным инструментом (у них на сайте такие песни поют), я не понимаю.
Цитировать
есть QSqlQueryModel - он только для чтения
Нет-это даже в доке написано.

Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #4 : Март 16, 2010, 17:39 »

Цитировать
очень просто. после ввода значения в ячейку и ПОДТВЕРЖДЕНИЕ, значение на экране меняется на старое, т.е. в модели обновление рекорда не происходит,а в базе изменяется потому что вызывается setData().
Вы с моделью намутили - проверьте что она у вас возвращает для метода Data() в EditRole, и для дроугих ролей
У меня есть маленький компонент справочник в котором все в порядке, да и наивно было бы думать что такой косяк со вводом - который проявляется только у вас есть ошибка проектирования Qt!

Цитировать
Если мне память не изменяет, то это только для QSqlTableModel.
Да - но у вас же своя модель - вот и надо по аналогии с QSqlTableModel реализовать отложенную отправку данных в БД как в QSqlTableModel при политике OnManualSubmit.

Цитировать
В тех же делфи не толко в фиб -это стандарт.
Какой нафик стандарт?Непонимающий Это платные дополнительные компоненты - как и все хорошее для делфи - а стандарт там IBDatabase полуживой и полурабочий, которые без исходников и с FB не работает толком!

Цитировать
Так же как и во многих других языках.
поконкретней нельзя - списочек языков с поддержкой хороших клиентских компонент по работе с БД.?

Цитировать
Для моих целей нужна именно полноценная работа с БД и гуи, нужен готовый велосипед, допилить его до свих нужд -это вопрос второй.
В свое время работая в делфи много с БД - все время приходилось что-то доделывать даже используя платные FIBc, FastReport и др. попсовые штучки...

Цитировать
Вообще судя по программам на qt-apps каждый выдумывал в БД-ориентированных программах кто в лес кто по дрова, да и программ этих не много.
qt-apps - просто сайт с нароботками от всех подряд что ж там ожидать - сплоченной работы группы программистов?

Цитировать
У меня сложилось впечатление, что троли развивают толко то, что пригодиться только в коммуникаторах, а уже потом в остальном. Зачем было делать костыли и называть это полноценным инструментом (у них на сайте такие песни поют), я не понимаю.
Не удивительно что сейчас мобильникам удиляется повышенное внимание, но это разве плохо? Что вы называете костылями? Sql модуль? Он делает главное - возможность использования SQL запросов, возможность написания своих моделей, доступ к БД. Это полноценный инструмент, пусть даже и не блещущий функционалом. (уже упоминал что в той же делфи стандартные средства не превосходят по функционалу, а вот по глюкам еще как превосходят, а факт отсутствия исходников вообще ставит под сомнение возможность их использования)

Цитировать
Цитировать
есть QSqlQueryModel - он только для чтения
Нет-это даже в доке написано.
Что написано??? что он редактируемый ? покажи!
Записан
Troglodit
Гость
« Ответ #5 : Март 16, 2010, 18:12 »

Цитировать
Вы с моделью намутили - проверьте что она у вас возвращает для метода Data() в EditRole, и для дроугих ролей
У меня есть маленький компонент справочник в котором все в порядке, да и наивно было бы думать что такой косяк со вводом - который проявляется только у вас есть ошибка проектирования Qt!
метод Data я не переопределял. Ошибки никакой нет. Пока после обновления нет refresh все так криво. В их же примере после изменения поля именно рефреш.
цитата с хелпа
Цитировать
The model is read-only by default. To make it read-write, you must subclass it and reimplement setData() and flags(). Another option is to use QSqlTableModel, which provides a read-write model based on a single database table.

The sql/querymodel example illustrates how to use QSqlQueryModel to display the result of a query. It also shows how to subclass QSqlQueryModel to customize the contents of the data before showing it to the user, and how to create a read-write model based on QSqlQueryModel.
даже пример есть в демо. Я не говорил, что у меня не получилось. я считаю очень накладно при изменении 1 записи рефрешить весь запрос, т.к. он может быть очень тяжелым (повторюсь я не прос адресную книгу сейчас говорю, а реальное приложение с агрегациями, множественными джойнами и т.д.)

Цитировать
Какой нафик стандарт? Это платные дополнительные компоненты - как и все хорошее для делфи - а стандарт там IBDatabase полуживой и полурабочий, которые без исходников и с FB не работает толком!
Для тех кто в танке, стандартный класс TQuery для работы с бд поддерживает и кэширование и обновление запросов (не только в делфи такие классы).

Цитировать
Не удивительно что сейчас мобильникам удиляется повышенное внимание, но это разве плохо? Что вы называете костылями? Sql модуль? Он делает главное - возможность использования SQL запросов, возможность написания своих моделей, доступ к БД. Это полноценный инструмент, пусть даже и не блещущий функционалом. (уже упоминал что в той же делфи стандартные средства не превосходят по функционалу, а вот по глюкам еще как превосходят, а факт отсутствия исходников вообще ставит под сомнение возможность их использования)
Предположим, что я тупой и не смог разобраться в доках или невнимателен и что то пропустил. Для написания простейшего функционала, а именно гридушки, в которой будет результат запроса с возможностью его редактирования, в Делфи мне понадобиться от силы 5 мин. без кликов мыши и чистым кодом. В QT бьюсь неделю и не могу подобное сделать, за исключением тех костылей что описал выше.

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

ЗЫ. на делфи написано очень много дб-прикладных программ, да где то есть перегибы, но в целом возможно вы не с той стороны юзали.
Записан
Troglodit
Гость
« Ответ #6 : Март 16, 2010, 18:29 »

пример троллей
и в нем все тоже самое если убрать refresh(); в котором
Код:
setQuery("select * from person");

соотвественно фокус сбивается и текущей записью становится запись № 1
по мне так это просто заготовка, но повторюсь мож я сего не понял и поэтому прошу помощи разобраться.

Код:
#include <QtSql>

 #include "editablesqlmodel.h"

 EditableSqlModel::EditableSqlModel(QObject *parent)
     : QSqlQueryModel(parent)
 {
 }

 Qt::ItemFlags EditableSqlModel::flags(
         const QModelIndex &index) const
 {
     Qt::ItemFlags flags = QSqlQueryModel::flags(index);
     if (index.column() == 1 || index.column() == 2)
         flags |= Qt::ItemIsEditable;
     return flags;
 }

 bool EditableSqlModel::setData(const QModelIndex &index, const QVariant &value, int /* role */)
 {
     if (index.column() < 1 || index.column() > 2)
         return false;

     QModelIndex primaryKeyIndex = QSqlQueryModel::index(index.row(), 0);
     int id = data(primaryKeyIndex).toInt();

     clear();

     bool ok;
     if (index.column() == 1) {
         ok = setFirstName(id, value.toString());
     } else {
         ok = setLastName(id, value.toString());
     }
     refresh();
     return ok;
 }

 void EditableSqlModel::refresh()
 {
     setQuery("select * from person");
     setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
     setHeaderData(1, Qt::Horizontal, QObject::tr("First name"));
     setHeaderData(2, Qt::Horizontal, QObject::tr("Last name"));
 }

 bool EditableSqlModel::setFirstName(int personId, const QString &firstName)
 {
     QSqlQuery query;
     query.prepare("update person set firstname = ? where id = ?");
     query.addBindValue(firstName);
     query.addBindValue(personId);
     return query.exec();
 }

 bool EditableSqlModel::setLastName(int personId, const QString &lastName)
 {
     QSqlQuery query;
     query.prepare("update person set lastname = ? where id = ?");
     query.addBindValue(lastName);
     query.addBindValue(personId);
     return query.exec();
 }
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #7 : Март 16, 2010, 18:49 »

бессмысленные базары

SQLTableModel наследник SQLQueryModel - в нем все работает - значит нужно написать своего похожего наследника с поддержкой отложенного обновления - в качестве хелпа руководствоваться исходником SQLTableModel, если можно было написать этот класс для одной таблицы (которая один хрен выбирает данные SQL запросом) - то можно и для нескольких

Если вы ждете что это кто-то сделает за вас - то ждите однажды это точно кто-то сделает но тогда когда понадобится ему.

Я могу поделиться только своим исходником справочника(окошко с tableView фильтром и т.д., которому говорится имя таблицы и еще несколько параметров и оно работает как справочник БД) которым пользуюсь - но он использует SqlRelationTableModel т.к. для программы с которой сейчас занимаюсь пока достаточно выборок из одной таблицы.
Записан
Troglodit
Гость
« Ответ #8 : Март 16, 2010, 19:03 »

в этом топики с Вами (хотя очень мого ваших комментариев мне очень понравились) действительно не зачем

Код:
Я могу поделиться только своим исходником справочника(окошко с tableView фильтром и т.д., которому говорится имя таблицы и еще несколько параметров и оно работает как справочник БД) которым пользуюсь - но он использует SqlRelationTableModel т.к. для программы с которой сейчас занимаюсь пока достаточно выборок из одной таблицы.
это сделает даже амеба, я же говорил про другое.
SqlRelationTableModel-это зло, если подстановочный справочник огромный (например люди,банковские счет и т.д.) а если он не один -это вообще труба.

ЗЫ. Кстати вы уверены, что QTableModel обновляет(рефреш) только 1 запись, а не все, при редактировании?
Записан
asvil
Гость
« Ответ #9 : Март 16, 2010, 23:08 »

Цитировать
Цитировать
Однако если мне не изменяет память реализация Sql*Model хранит данные модели в QSqlQuery и при запросах представлений просто делает QSqlQuery::seek(). Это начит setData не получиться, так как QSqlQuery не поволяет менять данные внутри себя.
есть QSqlQueryModel - он только для чтения
есть QSqlTableModel - он наследник QSqlQueryModel и при этом он Чтение-Запись - а из ваших рассуждений это невозможно...
Продолжу рассуждение тем, что QSqlTableModel::submit(), делает INSERT|UPDATE, после чего делает QSqlQuery::exec("select...."), что перезагружает все данные модели. Те я хочу сказать причина того что QSqlTableModel перекидывает курсор на первую строку, при редактировании и autosubmit, кроется в системе хранения данных модели. А она может и оптимальна, но я лично для табличной модели храню данные в QHash< int, QHash< int, QVariant> >. Может быть я ошибаюсь. Заполняю "этакую" матрицу с помощью QSqlQuery. Ставлю QSqlQuery::setForwardOnly(), и в каждом fetchMore дозагружаю порцию. Также надеюсь, что в реализации sql драйверов, используется механизм экономии трафика.

Но даже если я использую QHash, то в итоге память будет кушаться, в зависимости от кол-ва предоставляемых пользователю данных. Тут уже вопрос стоит в реализации формочек ввода/вывода sql табличек.
До написания своей модели (могу выложить исходный код), я искал реализацию sql модели а-ля ms access, но в итоге не нашел.

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

Qt на мой взгляд не предоставляет такого уж удобного интерфейса для наследования/доработки классов.
Конкретный пример QHeaderView::paintSection(); Загляните в исходники, для красивой отрисовки там используются приватные члены|функции, например определения размещения курсора мыши над заголовком. А когда ты наследуешь данный класс, то приходиться делать mapFromGlobal(cursor->pos), QRect::isContain() и т.д. Для решения данной проблемы я вижу один из выходов: тролли документируют приватные классы и выносят их в инсталяццию по умолчанию. Не самый лучший конечно вариант. Но взять к примеру ту же разработку kent'а QRemoteScriptDebugger, которая требует наличие приватных заголовочных файлов. Создается ситуация когда только тролли смогут делать качественные компоненты, а остальные разработчики уже только локальные проекты/компоненты будут делать.

Так или иначе qt хороша.

А зачем вы используете резкость в разговорах?
Записан
Troglodit
Гость
« Ответ #10 : Март 17, 2010, 10:15 »

2asvil
Цитировать
До написания своей модели (могу выложить исходный код), я искал реализацию sql модели а-ля ms access, но в итоге не нашел.
Было бы очень здорово глянуть на код.
Огромное спасибо за развернутые и доходчивые комментарии.
QT действительно очень интересный фреймворк и я нисколько не умаляю его доствоинств.
Цитировать
А зачем вы используете резкость в разговорах?
Действительно, незачем, просто эмоции.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #11 : Март 17, 2010, 12:01 »

Цитировать
ЗЫ. Кстати вы уверены, что QTableModel обновляет(рефреш) только 1 запись, а не все, при редактировании?

Надоело повторять одно и то же у меня там используется onManualSubmit - что является правильным и до нажатия кнопки "подтвердить" справочника вообще ничего не обновляется в БД и это верно в 90 % использования справочников. И ничего не переоткрывается и никуда не перескакивает.

Цитировать
это сделает даже амеба, я же говорил про другое.
я таких амеб не встречал, даже в делфи с его попсовыми штучками

Цитировать
SqlRelationTableModel-это зло, если подстановочный справочник огромный (например люди,банковские счет и т.д.) а если он не один -это вообще труба.
Обоснуй - я не смотрел в исходники но если join выполняется на стороне сервера(90% что так) то это самый стандартный подход, как можно сделать по другому?

Цитировать
А она может и оптимальна, но я лично для табличной модели храню данные в QHash< int, QHash< int, QVariant> >.
имея SqlQuery который уже фактически хеш хеша еще раз загонять данные в свой буферный хеш хеша не вижу никакого смысла...Это очень очень не эффективно! Да и работать с этим не удобно!

Цитировать
Конкретный пример QHeaderView::paintSection();
Здесь обсуждалась модель - а не вьюха, может для заголовков таблицы и нет удобного интерфейса, однако на этом форуме есть пример "продвинутого заголовка", который вроде бы написан именно с использованием того подхода кот. заложили кутешники.

Цитировать
Qt на мой взгляд не предоставляет такого уж удобного интерфейса для наследования/доработки классов.
Насколько он должен быть удобен? В идеале накидать на форму НЕВИЗУАЛЬНЫХ компонент драг дропом проставить свойства и получить программу БД? Реально это не плохо, и ускоряет разработку но Qt не конструктор БД шных окошен, а библиотека с пом. которой его можно написать.

Цитировать
Если подстановочный справочник огромный необходимо реализовывать своего делегата, который например диалог отображает, где подстановочные данные в таблице/иерархии представляются пользователю.
А если он не предназначен для изменения зачем мне этот диалог? Вообще это другая тема к создание правильно SQL модели отношения не имеет... Все перепутываете и сливаете в одно.
Записан
Troglodit
Гость
« Ответ #12 : Март 17, 2010, 12:56 »

Цитировать
Надоело повторять одно и то же у меня там используется onManualSubmit - что является правильным и до нажатия кнопки "подтвердить" справочника вообще ничего не обновляется в БД и это верно в 90 % использования справочников. И ничего не переоткрывается и никуда не перескакивает.
Со всем уважением мне тоже надоело повторять, что после обновления записи в БД заново вызывается весь запрос (я понимаю, что он вернет только часть записей, но если используются статистические или просто сложные агрегационные функции-это очень большая и , что самое главное бессмысленная,нагрузка). Про изменение фокусировки,я абсолюно согласен с Вами, что можно посмотреть в QSQLTableModel и что-то сделать наподобие. но повторюсь, все можно и на чистом с++ написать, суть фреймворка в облегчении и СТАНДАРТИЗАЦИИ. Я восхищен продуманностью и легкостью упраления некторыми QTшными классами, но для БД это сделано не было.
ЗЫ. Посмотрите демо sql/querymodel  от троллей, на ваш взгляд это полноценный способ редактируемой модели или это тупо костыль?
Цитировать
Обоснуй - я не смотрел в исходники но если join выполняется на стороне сервера(90% что так) то это самый стандартный подход, как можно сделать по другому?
предположим у вас в таблице, в которой находится тело документа(например накладная реализации). Туда входит код товара (справочник 50000 записей), сертификат (200000), то для ОТОБРАЖЕНИЯ в table  model вам придется тянуть эти таблицы с сервера. При этом нагрузка несоизмерима, потому как простой селект вернет вам необходимое кол-во записей переварив на сервере, надо отбразить кол-во не в штука а в упаковках и прочее прочее. TableModel не не оптимален в большинстве случаев, когда программа сложнее адресной книги.
Цитировать
Насколько он должен быть удобен? В идеале накидать на форму НЕВИЗУАЛЬНЫХ компонент драг дропом проставить свойства и получить программу БД? Реально это не плохо, и ускоряет разработку но Qt не конструктор БД шных окошен, а библиотека с пом. которой его можно написать.
У вас явная боязнь визуального представления информации. Кстати мне очень понравилось в Qt возможность дизайна гуя без визуального перетаскивания, но это не значит, что данный способ идеальный. Троли предоставили выбор, именно о выборе я и говорю, что с бд его нет, приходится выдумывать свой велосипед. Повторюсь, но я проглядел несколько программ на qt-apps с БД и во всех случаях каждый городил что-то свое, это говорит о том, что велосипеда для БД нет у троллей.
Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #13 : Март 17, 2010, 13:16 »

Цитировать
что после обновления записи в БД заново вызывается весь запрос
так в случае onManualSubmit запрос не вызывается после изменения записи (мне кажется или я повторяюсь?)

Цитировать
предположим у вас в таблице, в которой находится тело документа(например накладная реализации). Туда входит код товара (справочник 50000 записей), сертификат (200000), то для ОТОБРАЖЕНИЯ в table  model вам придется тянуть эти таблицы с сервера. При этом нагрузка несоизмерима, потому как простой селект вернет вам необходимое кол-во записей переварив на сервере, надо отбразить кол-во не в штука а в упаковках и прочее прочее. TableModel не не оптимален в большинстве случаев, когда программа сложнее адресной книги.
Я не смотрел исходник - если RelationModel тянет весь справочник то да неоптимально, но об этом упомянул уже выше. Реализовать свой SQLRelationModel который делает join на сервере проблем нет.

В конце концов можно оттолкнуться даже от AbstractModel ( агрегировать туда несколько QSqlQuery для запросов select, update, insert и т.д. ), если в SQLQuiery как в бвзовом классе действительно смысла не будет(но это нужно смотреть) и реализовать аналог FIBDataset кот. при этом сразу буджет работать во вьюхе!

Цитировать
Кстати мне очень понравилось в Qt возможность дизайна гуя без визуального перетаскивания, но это не значит, что данный способ идеальный.
Перетаскивание там есть - не знаю о каком дизайне можно говорить без перетаскивания (как же вы располагаете подвиджеты на форме - не перетаскивая их? ). Я говорил о ПЕРЕТАСКИВАНИЕ НА ФОРМУ НЕВИЗУАЛЬНЫХ компонент типа DataBase, DataSet, Query и т.д. в делфи это типовой подход.

Цитировать
У вас явная боязнь визуального представления информации.
Слушай у тебя никакой болезние нет? Ты доктор?

Цитировать
Повторюсь, но я проглядел несколько программ на qt-apps с БД и во всех случаях каждый городил что-то свое, это говорит о том, что велосипеда для БД нет у троллей.
это смешно - просматривать программки авторов не зная их квалификацию и делать выводы о том что раз все они сделали по разному значит идеального решения в пределах библиотеки нет...

Опять же повторюсь - еще в 1 своем посте сказал что да модуль SQL у Qt слабоват но назвать его совсем отсутствующим нельзя т.к. есть
1) кросплатформенный доступ к БД
2) Возможность расширения списка БД за счет своих плагинов
3) Нормально рбочий QSqlQuery через кот. можно реализовать все выборку, обновление, создание метаданных и т.д.
4) Начальные (примитивные - на вашем лексиконе костыли ) клиентскеие компоненты, с исходниками, смотря на которые можно реализовавыть полноценные аналоги из других сред.

Цитировать
все можно и на чистом с++ написать
тогда о чем речь
Qt -= sql

и в путь!
Записан
Troglodit
Гость
« Ответ #14 : Март 17, 2010, 13:38 »

Цитировать
так в случае onManualSubmit запрос не вызывается после изменения записи (мне кажется или я повторяюсь?)
Код:
    case OnManualSubmit:
        for (QSqlTableModelPrivate::CacheMap::ConstIterator it = d->cache.constBegin();
             it != d->cache.constEnd(); ++it) {
            switch (it.value().op) {
            case QSqlTableModelPrivate::Insert:
                if (!insertRowIntoTable(it.value().rec))
                    return false;
                d->bottom = d->bottom.sibling(d->bottom.row() + 1, d->bottom.column());
                break;
            case QSqlTableModelPrivate::Update:
                if (!updateRowInTable(it.key(), it.value().rec))
                    return false;
                break;
            case QSqlTableModelPrivate::Delete:
                if (!deleteRowFromTable(it.key()))
                    return false;
                break;
            case QSqlTableModelPrivate::None:
                Q_ASSERT_X(false, "QSqlTableModel::submitAll()", "Invalid cache operation");
                break;
            }
        }
        d->clearCache();
        return select();
    }
последняя команда

Цитировать
Перетаскивание там есть - не знаю о каком дизайне можно говорить без перетаскивания (как же вы располагаете подвиджеты на форме - не перетаскивая их? ). Я говорил о ПЕРЕТАСКИВАНИЕ НА ФОРМУ НЕВИЗУАЛЬНЫХ компонент типа DataBase, DataSet, Query и т.д. в делфи это типовой подход.
легко, layout-плюс немного фантазии

Цитировать
это смешно - просматривать программки авторов не зная их квалификацию и делать выводы о том что раз все они сделали по разному значит идеального решения в пределах библиотеки нет...

Опять же повторюсь - еще в 1 своем посте сказал что да модуль SQL у Qt слабоват но назвать его совсем отсутствующим нельзя т.к. есть
1) кросплатформенный доступ к БД
2) Возможность расширения списка БД за счет своих плагинов
3) Нормально рбочий QSqlQuery через кот. можно реализовать все выборку, обновление, создание метаданных и т.д.
4) Начальные (примитивные - на вашем лексиконе костыли ) клиентскеие компоненты, с исходниками, смотря на которые можно реализовавыть полноценные аналоги из других сред
  именно потому, что там авторы разной квалификации, поэтому и стоит рассматривать. Сделать редактируемый скл набор должен уметь даже новичок,так как это сделано в других фрейворках (про делфи не говорю).
по пунктам.
1. Это есть не толко в qt (этим я не опровергаю удобство)
2. Также есть во многих библиотеках к языкам (бесплатные или в комплекте с средой)
3. это может сделать дажe FoxPro Dos-времен.
4. А холивар с языками программирования заканчивается, когда приходят асм-овцы и говорят писать на асме, вот там можно сделать все что угодно. По сравнению с другими средами-здесь полноценный режим только для чтения. Полноценной модели здесь нет, собственно топик и был создан для выяснения, обобщения мыслей разных людей.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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