Вопросы по примеру staffmanager из книги Бланшет "Qt 4. Программирование GUI на C++" |
Здравствуйте, гость ( Вход | Регистрация )
Вопросы по примеру staffmanager из книги Бланшет "Qt 4. Программирование GUI на C++" |
Анна |
31.5.2013, 12:13
Сообщение
#11
|
Активный участник Группа: Участник Сообщений: 276 Регистрация: 22.5.2008 Из: Зеленоград Пользователь №: 181 Спасибо сказали: 30 раз(а) Репутация: 4 |
Я думаю, чтобы не мучиться с обработкой каждой мелочи, делая редактирование таблиц БД прямо в TableView, взять и сделать TableView нередактируемым, сделать разные контролы для полей таблицы, кнопки подтверждения и отката изменений в текущей записи, добавления и удаления записи, при нажатии кнопок обработать разные ситуации. Так у меня будет меньше проблем? Для оператора все станет яснее? Как вы считаете? Да. |
|
|
Steklova Olga |
31.5.2013, 13:01
Сообщение
#12
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Да. хорошосделать разные контролы для полей таблицы если эти контролы подключить к QDataWidgetMapper, у которого установить (это я смотрю пример chap18/db04 из книги Земскова "Qt4 на примерах" )то, запуская пример, вижу, что этот автоматический submit mapper'а тоже работает кривовато... Т.е., правильно я понимаю?, что при QDataWidgetMapper::AutoSubmit, если оператор установит фокус на какой-то контрол маппера, откорректирует в нем значение, то это значение автоматически засабмитится в маппер, только когда оператор установит фокус на другой контрол маппера. К тому же, от момента корректировки значения до этой смены фокуса оператор не должен менять текущую строку в модели. Так, может, тогда лучше сделать ручной сабмит не только модели но и мапперу? И по кнопке подтверждения изменения текущей записи вручную сабмитить сначала маппер, а потом модель?
|
|
|
Litkevich Yuriy |
31.5.2013, 13:11
Сообщение
#13
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Мапер решение специфическое, он живёт своей жизнью.
Если я не путаю, то настройка модели ничего не меняет при использовании Мапера. Влияют только его настройки. Ещё нюанс: при использовании Мапера становится невозможным использовать транзакции. Например, ты запускаешь транзакцию, пользователь взаимодействует с Мапером через виджеты, затем (по кнопке) фиксируешь трнзакцию. Фиксация при редактировании нескольких строк таблицы завершится неудачей. Т.к. в драйверах БД что-то идёт криво и ID транзакции используется неверный. Вообще Qt4 и транзакции вещи на практике не совместимые. |
|
|
Steklova Olga |
31.5.2013, 14:08
Сообщение
#14
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Там вроде ещё Tab также обрабатывается. нетЗапустила пример, Tab не помогает при корректировки таблицы БД прямо в TableView. Зато, при корректировке таблицы БД через QDataWidgetMapper помогает смена фокуса на другой контрол маппера с помощью Tab или курсора, а Enter в этом случае не подходит. Ещё нюанс: при использовании Мапера становится невозможным использовать транзакции. Например, ты запускаешь транзакцию, пользователь взаимодействует с Мапером через виджеты, затем (по кнопке) фиксируешь трнзакцию. Фиксация при редактировании нескольких строк таблицы завершится неудачей. Т.к. в драйверах БД что-то идёт криво и ID транзакции используется неверный. Почему вы говорите, что нельзя использовать транзакции? Может, я неверно поняла, что вы этим хотите сказать, о какой транзакции идет речь?В примере chap18/db04 из книги Земскова "Qt4 на примерах" есть такой код: Тут есть транзакция. Запускаю пример, редактирую одну запись таблицы БД в маппере, завершаю корректировку сменой фокуса с последнего откорректиррованного контрола на другой, затем аналогично редактирую другую запись, только после этого нажимаю кнопку "записать". И все срабатывает, все изменения обеих записей сохраняются в таблице БД. А вы о чем говорили?
|
|
|
Litkevich Yuriy |
31.5.2013, 15:09
Сообщение
#15
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Steklova Olga |
31.5.2013, 15:18
Сообщение
#16
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
|
|
|
Steklova Olga |
31.5.2013, 15:50
Сообщение
#17
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Поменяла для себя в коде примера драйвер на QIBASE, так как работаю с FireBird 2.1.
Пустую БД создала в IBExpert, а таблицы и данные для них добавила с помощью примера chap17/db00, подправив запрос создания таблицы (из-за того, что в FireBird нет типа boolean). |
|
|
Litkevich Yuriy |
31.5.2013, 16:13
Сообщение
#18
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Steklova Olga |
31.5.2013, 17:02
Сообщение
#19
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
можно было создать домен, а остальное оставить как есть. домен-то создать было можно, но такой запрос создания таблицы все равно бы не прошелв примере в SQL команде CREATE TABLE указано NULL для некоторых полей, а в FireBird такого нет. В FireBird есть [DEFAULT {<литерал> | NULL}] и [NOT NULL] формат SQL команды CREATE TABLE в FireBird А что имеется в виду в примере, когда пишется NULL: DEFAULT NULL словами FireBird'а или то, что поле может принимать значение NULL? |
|
|
Steklova Olga |
31.5.2013, 17:52
Сообщение
#20
|
Участник Группа: Участник Сообщений: 198 Регистрация: 27.9.2011 Из: Санкт-Петербург Пользователь №: 2912 Спасибо сказали: 5 раз(а) Репутация: 4 |
Начала проверять разные ветки алгоритма работы оператора в этом примере у Земскова. Мне кажется, некоторые ветки не доделаны. Вы про это говорили, Юрий?
Смотрите, делаю так: Запускаю пример, "Новая строка", Номер = 1, Имя = 1, перевожу фокус на Номер, кнопку "Записать" НЕ НАЖИМАЮ, "Новая строка", Номер = 2, Имя = 2, перевожу фокус на Номер, НАЖИМАЮ кнопку "Записать" - все ОК, в таблице сохранились две новые записи, закрываю программу. Запускаю пример, "Новая строка", Номер = 3, Имя = 3, перевожу фокус на Номер, НАЖИМАЮ кнопку "Записать" - все ОК, в таблице сохранилась одна новая запись, "Новая строка", Номер = 3, Имя = 4, перевожу фокус на Номер, НАЖИМАЮ кнопку "Записать" - получаю сообщение: "The database reported an error: invalid transaction handle (expecting explicit transaction start) Unable to execute query", вторая запись не сохраняется. Такой с виду пример хороший, так и хочется списать, подкрутив кое-что. Может кто сказать, как довести этот пример до ума? Что ж мне делать? Как мне быть? Как задачку мне решить? |
|
|
Текстовая версия | Сейчас: 4.12.2024, 23:49 |