QDataWidgetMapper & New Record, Add/Del Record with QDataWidgetMapper |
Здравствуйте, гость ( Вход | Регистрация )
QDataWidgetMapper & New Record, Add/Del Record with QDataWidgetMapper |
JohnZ |
14.7.2015, 11:04
Сообщение
#1
|
Участник Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: 0 |
Помогите плз решить такую проблему ...
Имеется динамический диалог, в котором произведено опять-же динамическое связывание полей и записи с пом-ю QDataWidgetMapper. () Используемая модель, - QTableView. Для случая редактирования записи, проблем нет, вызывается Dialog->exec() и далее в зависимости от рез-та сохраняем запись ( dataMapper->submit() ). А как быть в случае добавления записи ? Т.е. нужно очистить диалог, дать возможность юзверю ввести свои данные, и затем добавить запись. Дело в том, что кнопка Insert может быть нажата на _любой_ записи в списке (QTableView), и при смапированных полях, может пострадать "ни в чём не виновная" запись Делать очистку dataMapper->clearMapping() тоже не вариант, т.к. в след-й раз чтобы показать этот-же диалог на редактирование, нужно будет перестраивать кроме этого диалога (и мапирования) все возможные связанные (child) диалоги. ВотЪ, объяснил как смог. Помогите плз кто в курсе проблемы. В принципе более интерисует алгоритм решения проблемы, нежели код. Если нужен код мапирования и запуска диалога, - выложу, но как я уже сказал, он тривиален, всё взято из примеров. И попутно, вопрос по отображению даты в QTableView. В примере sqlbrowser, год отображается 4-мя цифрами, а у меня почему-то 2-мя. Пересмотрел весь пример, этой установки не нашёл. В чём трабл ? Заранее благодарю за помощь. |
|
|
lanz |
14.7.2015, 13:10
Сообщение
#2
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
При нажатии кнопки Add сначала добавлять строку с дефолтными значениями и переключать маппер на нее.
С форматированием строк надо копать делегаты. Я бы начал с этого, переопределив http://doc.qt.io/qt-4.8/qitemdelegate.html#paint Глядя на https://github.com/qtproject/qtbase/blob/de...legate.cpp#L329 |
|
|
JohnZ |
14.7.2015, 19:27
Сообщение
#3
|
Участник Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: 0 |
При нажатии кнопки Add сначала добавлять строку с дефолтными значениями и переключать маппер на нее. Этот вариант я тоже обмозговывал, но затем отмёл как нежизнеспособный по нескольким причинам: 1. Юзверь в последний момент может отказаться от ввода, нажав отмену, а пустая запись уже создана ?! 2. Как при работе в сети должно происходить создание пустых записей в базе при наличии уникального ключа, возможно составного, да ещё и со связанными таблицами, как в накладной ?! 3. В момент создания пустышки (находясь в мульти-юзере) банально пропал свет ?! Тут нужно как-ниить "маппера" уговорить этим заниматься. Может создать потомка и добавить ему NewRecord() с временным запретом мапирования по флажку ? Цитата С форматированием строк надо копать делегаты. Я бы начал с этого, переопределив http://doc.qt.io/qt-4.8/qitemdelegate.html#paint Глядя на https://github.com/qtproject/qtbase/blob/de...legate.cpp#L329 Всё правильно, но ведь в исходнике sqlbrowser-а нет ни строчки упоминания про делегата !!! Мне нужно/интересно разобраться КАК он это делает ... Был-бы код делегата или его вызов, понятное дело, а то ведь нету ?! |
|
|
lanz |
15.7.2015, 9:24
Сообщение
#4
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата Этот вариант я тоже обмозговывал, но затем отмёл как нежизнеспособный по нескольким причинам: 1. Юзверь в последний момент может отказаться от ввода, нажав отмену, а пустая запись уже создана ?! 2. Как при работе в сети должно происходить создание пустых записей в базе при наличии уникального ключа, возможно составного, да ещё и со связанными таблицами, как в накладной ?! 3. В момент создания пустышки (находясь в мульти-юзере) банально пропал свет ?! Это же БД Начинаем транзакцию, и 1. Юзер отказывается -> rollback 2. Создаем настоящий уникальный ключ, так же, как он создается сейчас, автоинкремент или хранимая процедура. 3. Пропал свет -> пропала транзакция Если все хорошо, делаем commit У модели есть http://doc.qt.io/qt-4.8/qabstractitemmodel.html#submit http://doc.qt.io/qt-4.8/qabstractitemmodel.html#revert Цитата Был-бы код делегата или его вызов, понятное дело, а то ведь нету ?! А можно ссылку на этот пример, а то я чего то не найду. |
|
|
JohnZ |
15.7.2015, 10:27
Сообщение
#5
|
Участник Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: 0 |
Цитата Этот вариант я тоже обмозговывал, но затем отмёл как нежизнеспособный по нескольким причинам: 1. Юзверь в последний момент может отказаться от ввода, нажав отмену, а пустая запись уже создана ?! 2. Как при работе в сети должно происходить создание пустых записей в базе при наличии уникального ключа, возможно составного, да ещё и со связанными таблицами, как в накладной ?! 3. В момент создания пустышки (находясь в мульти-юзере) банально пропал свет ?! Это же БД Начинаем транзакцию, и 1. Юзер отказывается -> rollback 2. Создаем настоящий уникальный ключ, так же, как он создается сейчас, автоинкремент или хранимая процедура. 3. Пропал свет -> пропала транзакция Если все хорошо, делаем commit У модели есть http://doc.qt.io/qt-4.8/qabstractitemmodel.html#submit http://doc.qt.io/qt-4.8/qabstractitemmodel.html#revert В транзакции я пока не "обоачивал", мне было важно принципиально разобраться возможно или нет. Пока проблема решилась следующим образом ... "Уговорил" я мапера Раскрывающийся текст case Qt::Key_Insert: event->accept(); idx = formChild->dataMapper->currentIndex(); formChild->dataMapper->clearMapping(); formChild->clearFieldsValues(); if (formChild->exec() == QDialog::Accepted) { curRecord = model->record(); model->insertRecord (-1, curRecord); formChild->mapDynaProperty(); formChild->dataMapper->submit(); } else formChild->mapDynaProperty(); formChild->dataMapper->setCurrentIndex(idx); return; // clearFieldsValues() очистка элементов формы, например lineEdit->clear(); // mapDynaProperty() связывание с БД элементов формы Цитата Цитата Был-бы код делегата или его вызов, понятное дело, а то ведь нету ?! А можно ссылку на этот пример, а то я чего то не найду. В директории установленной QT в папке demos. У меня на машине это D:\QT\4.5.3\demos\sqlbrowser\ Сообщение отредактировал JohnZ - 15.7.2015, 10:33 |
|
|
lanz |
15.7.2015, 13:57
Сообщение
#6
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Цитата "Уговорил" я мапера Это хорошо Просто одна мысль: Рассмотрите такой вариант развития событий. 1. Пользователь вводит данные полчаса 2. Прежде чем он успел нажать OK, выключается свет. В случае использования транзакций, в журнале БД могут остатся данные и можно попробовать их спасти. В случае когда вставка не происходит, данные можно тоже временно куда то сохранить, но зачем дублировать функционал БД. Посмотрел, не нашел ничего про даты, может в Qt5 другой пример? (или я вижу фигу ) (Да, смотрел здесь https://github.com/qtproject/qtbase/tree/de...sql/sqlbrowser) |
|
|
JohnZ |
15.7.2015, 19:58
Сообщение
#7
|
Участник Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: 0 |
Цитата "Уговорил" я мапера Это хорошо Просто одна мысль: Рассмотрите такой вариант развития событий. 1. Пользователь вводит данные полчаса 2. Прежде чем он успел нажать OK, выключается свет. В случае использования транзакций, в журнале БД могут остатся данные и можно попробовать их спасти. В случае когда вставка не происходит, данные можно тоже временно куда то сохранить, но зачем дублировать функционал БД. В принципе пока планирую этот вариант для QRecordSet, т.е. работа по 1-й записи. Максимум что пропадёт, - 1 запись. Это терпимо, юзверь не успеет озвереть Цитата Посмотрел, не нашел ничего про даты, может в Qt5 другой пример? (или я вижу фигу ) (Да, смотрел здесь https://github.com/qtproject/qtbase/tree/de...sql/sqlbrowser) Пример тот-же, врядли его правили под 5-ку из 4-ки. Я уже и построчно пересматривал, и ui-шный файл, нет ничего про дату, но у меня аналогичная связка (QSqlTableModel & QTableView) дату показывает в коротком формате. Магия какая-то Где искать - хез ... Ссылка почему-то не рабочая. Показывает 404 страницу. |
|
|
lanz |
15.7.2015, 22:08
Сообщение
#8
|
Старейший участник Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: 8 |
Там скобка в конце прилипла.
|
|
|
JohnZ |
16.7.2015, 12:38
Сообщение
#9
|
Участник Группа: Участник Сообщений: 139 Регистрация: 19.7.2014 Пользователь №: 4190 Спасибо сказали: 10 раз(а) Репутация: 0 |
|
|
|
Текстовая версия | Сейчас: 22.11.2024, 4:53 |