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-мя. Пересмотрел весь пример, этой установки не нашёл. В чём трабл ?

Заранее благодарю за помощь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
lanz
  опции профиля:
сообщение 15.7.2015, 9:24
Сообщение #2


Старейший участник
****

Группа: Участник
Сообщений: 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
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 25.11.2024, 18:09