crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Вопросы по примеру staffmanager из книги Бланшет "Qt 4. Программирование GUI на C++"
Анна
  опции профиля:
сообщение 31.5.2013, 12:13
Сообщение #11


Активный участник
***

Группа: Участник
Сообщений: 276
Регистрация: 22.5.2008
Из: Зеленоград
Пользователь №: 181

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




Репутация:   4  


Цитата(Steklova Olga @ 31.5.2013, 10:02) *
Я думаю, чтобы не мучиться с обработкой каждой мелочи, делая редактирование таблиц БД прямо в TableView,
взять и сделать TableView нередактируемым, сделать разные контролы для полей таблицы, кнопки подтверждения и отката изменений в текущей записи, добавления и удаления записи, при нажатии кнопок обработать разные ситуации.
Так у меня будет меньше проблем? Для оператора все станет яснее? Как вы считаете?

Да.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 31.5.2013, 13:01
Сообщение #12


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Цитата(Анна @ 31.5.2013, 12:13) *
Да.
хорошо

Цитата(Steklova Olga @ 31.5.2013, 9:02) *
сделать разные контролы для полей таблицы
если эти контролы подключить к QDataWidgetMapper, у которого установить
mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
(это я смотрю пример chap18/db04 из книги Земскова "Qt4 на примерах" )
то, запуская пример, вижу, что этот автоматический submit mapper'а тоже работает кривовато...

Т.е., правильно я понимаю?, что при QDataWidgetMapper::AutoSubmit,
если оператор установит фокус на какой-то контрол маппера, откорректирует в нем значение,
то это значение автоматически засабмитится в маппер, только когда оператор установит фокус на другой контрол маппера. К тому же, от момента корректировки значения до этой смены фокуса оператор не должен менять текущую строку в модели.

Так, может, тогда лучше сделать ручной сабмит не только модели
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
но и мапперу?
mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
И по кнопке подтверждения изменения текущей записи вручную сабмитить сначала маппер, а потом модель?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.5.2013, 13:11
Сообщение #13


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Мапер решение специфическое, он живёт своей жизнью.
Если я не путаю, то настройка модели ничего не меняет при использовании Мапера. Влияют только его настройки.

Ещё нюанс: при использовании Мапера становится невозможным использовать транзакции. Например, ты запускаешь транзакцию, пользователь взаимодействует с Мапером через виджеты, затем (по кнопке) фиксируешь трнзакцию. Фиксация при редактировании нескольких строк таблицы завершится неудачей. Т.к. в драйверах БД что-то идёт криво и ID транзакции используется неверный.

Вообще Qt4 и транзакции вещи на практике не совместимые.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 31.5.2013, 14:08
Сообщение #14


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Цитата(Litkevich Yuriy @ 30.5.2013, 21:33) *
Там вроде ещё Tab также обрабатывается.
нет
Запустила пример, Tab не помогает при корректировки таблицы БД прямо в TableView.
Зато, при корректировке таблицы БД через QDataWidgetMapper помогает смена фокуса на другой контрол маппера с помощью Tab или курсора, а Enter в этом случае не подходит.

Цитата(Litkevich Yuriy @ 31.5.2013, 13:11) *
Ещё нюанс: при использовании Мапера становится невозможным использовать транзакции. Например, ты запускаешь транзакцию, пользователь взаимодействует с Мапером через виджеты, затем (по кнопке) фиксируешь трнзакцию. Фиксация при редактировании нескольких строк таблицы завершится неудачей. Т.к. в драйверах БД что-то идёт криво и ID транзакции используется неверный.
Почему вы говорите, что нельзя использовать транзакции? Может, я неверно поняла, что вы этим хотите сказать, о какой транзакции идет речь?
В примере chap18/db04 из книги Земскова "Qt4 на примерах" есть такой код:
void MyView::saveData(){
    MyModel *m = qobject_cast<MyModel *>(model());
    if ( ! m ) return;

    m->database().transaction();
    if (m->submitAll()) {
        m->database().commit();
    }else{
        m->database().rollback();
        QMessageBox::warning(this, tr("Error"),
                             tr("The database reported an error: %1")
                             .arg(m->lastError().text()));
        m->select();
    }
}
Тут есть транзакция.
Запускаю пример, редактирую одну запись таблицы БД в маппере, завершаю корректировку сменой фокуса с последнего откорректиррованного контрола на другой, затем аналогично редактирую другую запись, только после этого нажимаю кнопку "записать".
    QPushButton *btnSave = new QPushButton(tr("&Записать"));
    QObject::connect(btnSave, SIGNAL(clicked()), view, SLOT(saveData()));
И все срабатывает, все изменения обеих записей сохраняются в таблице БД. А вы о чем говорили?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.5.2013, 15:09
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Steklova Olga, а как настроены модель и Мапер (режим)?

Цитата(Steklova Olga @ 31.5.2013, 16:08) *
MyModel *m = qobject_cast<MyModel *>(model());
к стати, это приведение излишне, т.к. методы модели, используемые в этой функции, объявлены в базовом классе модели.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 31.5.2013, 15:18
Сообщение #16


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Цитата(Litkevich Yuriy @ 31.5.2013, 15:09) *
а как настроены модель и Мапер (режим)?

в примере в книге так:
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
mapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Steklova Olga @ 31.5.2013, 17:50) *
из-за того, что в FireBird нет типа boolean
в Firebird есть домены (пользовательские типы данных), можно было создать домен, а остальное оставить как есть.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Steklova Olga
  опции профиля:
сообщение 31.5.2013, 17:02
Сообщение #19


Участник
**

Группа: Участник
Сообщений: 198
Регистрация: 27.9.2011
Из: Санкт-Петербург
Пользователь №: 2912

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




Репутация:   4  


Цитата(Litkevich Yuriy @ 31.5.2013, 16:13) *
можно было создать домен, а остальное оставить как есть.
домен-то создать было можно, но такой запрос создания таблицы все равно бы не прошел

в примере в 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", вторая запись не сохраняется.

Такой с виду пример хороший, так и хочется списать, подкрутив кое-что. Может кто сказать, как довести этот пример до ума?

Что ж мне делать?
Как мне быть?
Как задачку
мне решить? :rolleyes:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 20.10.2019, 12:29