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 |
15.7.2015, 9:24
Сообщение
#2
|
Старейший участник Группа: Участник Сообщений: 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
Сообщение
#3
|
Участник Группа: Участник Сообщений: 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 |
|
|
Текстовая версия | Сейчас: 25.11.2024, 18:09 |