crossplatform.ru

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

> 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), и при смапированных полях, может пострадать "ни в чём не виновная" запись :rolleyes:

Делать очистку dataMapper->clearMapping() тоже не вариант, т.к. в след-й раз чтобы показать этот-же
диалог на редактирование, нужно будет перестраивать кроме этого диалога (и мапирования) все
возможные связанные (child) диалоги.

ВотЪ, объяснил как смог. Помогите плз кто в курсе проблемы.
В принципе более интерисует алгоритм решения проблемы, нежели код.
Если нужен код мапирования и запуска диалога, - выложу, но как я уже сказал, он тривиален,
всё взято из примеров.

И попутно, вопрос по отображению даты в QTableView. В примере sqlbrowser, год отображается 4-мя
цифрами, а у меня почему-то 2-мя. Пересмотрел весь пример, этой установки не нашёл. В чём трабл ?

Заранее благодарю за помощь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов (1 - 8)
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  


Цитата(lanz @ 14.7.2015, 13:10) *
При нажатии кнопки 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. В момент создания пустышки (находясь в мульти-юзере) банально пропал свет ?!

Это же БД :lol:
Начинаем транзакцию, и
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  


Цитата(lanz @ 15.7.2015, 9:24) *
Цитата
Этот вариант я тоже обмозговывал, но затем отмёл как нежизнеспособный по нескольким причинам:
1. Юзверь в последний момент может отказаться от ввода, нажав отмену, а пустая запись уже создана ?!
2. Как при работе в сети должно происходить создание пустых записей в базе при наличии уникального ключа,
возможно составного, да ещё и со связанными таблицами, как в накладной ?!
3. В момент создания пустышки (находясь в мульти-юзере) банально пропал свет ?!

Это же БД :lol:
Начинаем транзакцию, и
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  


Цитата
"Уговорил" я мапера :)


Это хорошо :lol:
Просто одна мысль:
Рассмотрите такой вариант развития событий.
1. Пользователь вводит данные полчаса
2. Прежде чем он успел нажать OK, выключается свет.

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

Посмотрел, не нашел ничего про даты, может в Qt5 другой пример?
(или я вижу фигу :lol:)

(Да, смотрел здесь https://github.com/qtproject/qtbase/tree/de...sql/sqlbrowser)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 15.7.2015, 19:58
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 139
Регистрация: 19.7.2014
Пользователь №: 4190

Спасибо сказали: 10 раз(а)




Репутация:   0  


Цитата(lanz @ 15.7.2015, 13:57) *
Цитата
"Уговорил" я мапера :)


Это хорошо :lol:
Просто одна мысль:
Рассмотрите такой вариант развития событий.
1. Пользователь вводит данные полчаса
2. Прежде чем он успел нажать OK, выключается свет.

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

В принципе пока планирую этот вариант для QRecordSet, т.е. работа по 1-й записи.
Максимум что пропадёт, - 1 запись. Это терпимо, юзверь не успеет озвереть :lol:

Цитата
Посмотрел, не нашел ничего про даты, может в Qt5 другой пример?
(или я вижу фигу :lol:)
(Да, смотрел здесь https://github.com/qtproject/qtbase/tree/de...sql/sqlbrowser)

Пример тот-же, врядли его правили под 5-ку из 4-ки. Я уже и построчно пересматривал, и ui-шный файл,
нет ничего про дату, но у меня аналогичная связка (QSqlTableModel & QTableView) дату показывает в коротком
формате. Магия какая-то :blink: Где искать - хез ...
Ссылка почему-то не рабочая. Показывает 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  


Цитата(lanz @ 15.7.2015, 22:08) *
Там скобка в конце прилипла.

Да, уже увидел. Исходник тот-же, как я и предполагал, его не правили.
Но проблема с отображением даты в QTableView так и не решена :(
lanz, если найдёшь, дай знать, - и я соответственно тоже,
если найду, сообщу. Ок ?

Удачи !
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 11:46