crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QDataWidgetMapper->submit(), Передача данных в модель
JohnZ
  опции профиля:
сообщение 9.2.2017, 12:09
Сообщение #1


Участник
**

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

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




Репутация:   0  


Всем Здравия !

Помогите разобраться с проблемой ... Снега полно, а лыжи не едут :-)

        ......
    case Qt::Key_Insert:
            if (formChild)
            {
                event->accept();
                if (formChild->exec() == QDialog::Accepted)
               {
                               formChild->mapDynaProperty();         // Динамическое связывание полей формы с моделью
                               formChild->dataMapper->submit();    // По-идее Передача значений из формы в модель
                               curRecord = model->record();        // получает пустую запись !!! ???
                               model->insertRecord (-1, curRecord);
                               model->submitAll();                // <---- QSqlTableModel
                         }
                              ..............
                    }


Гугль выдал похожее решение в т.ч. правда без "динамики" ...
Была похожая тема, даже я её открывал, но как оказалось не решена окончательно , и ещё
есть какая-то "магическая" зависимость от того, есть в записи автоинкрементное поле или нет.

Кусок кода ниже из примера sqlbrowser, тоже не работает при наличии автоинкрементного поля в записи ...
                  QModelIndex insertIndex = viewChild->currentIndex();      // viewChild это QTableView
                  int row = insertIndex.row() == -1 ? 0 : insertIndex.row();
                  model->insertRow(row);
                  insertIndex = model->index(row, 0);  // <--- выдаёт INVALID-ный индекс
                  viewChild->setCurrentIndex(insertIndex);    // viewChild это QTableView
                  viewChild->edit(insertIndex);

На счёт автоинкрементного поля, - это пока предположение, проверяю ...
Может ну его этот dataMapper, и записывать значения в запись вручную, вместо дин-го связывания ?

Сообщение отредактировал JohnZ - 9.2.2017, 12:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.2.2017, 6:09
Сообщение #2


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

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

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




Репутация:   94  


Что-то я по коду ничего не понял.
Что такое
"formChild->mapDynaProperty();         // Динамическое связывание полей формы с моделью"

зачем
model->submitAll();
Если уже есть
 formChild->dataMapper->submit();

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 10.2.2017, 13:20
Сообщение #3


Участник
**

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 10.2.2017, 6:09) *
Что-то я по коду ничего не понял.
Что такое
"formChild->mapDynaProperty();         // Динамическое связывание полей формы с моделью"


Форма читается из XML-я (UI-файл), Связать поля формы с БД ведь как-то надо ... :-)
Раскрывающийся текст

// Связываем поля формы с БД
void fpForma::mapDynaProperty()
{
int i, x, Idd, nCnt;
QString aStr, aFld;
QObject *wo;

nCnt = formWidgets.count(); // <--- formWidgets - список объектов с дин-ми свойствами
for(i = 0;i < nCnt;i++)
{
wo = formWidgets.at(i);
Idd = wo->property("Idd").toInt();
aFld = QString("fld_%0").arg(Idd);
x = model->fieldIndex(aFld);
if (x < 0)
{
QMessageBox::warning(this, tr("Fin-Pro"),
tr("Field id = %0 Not Found !!!").arg(Idd));
continue;
}

if (!aStr.compare("QLabel"))
dataMapper->addMapping((QLabel *)wo, x);
else
if (!aStr.compare("QLineEdit"))
dataMapper->addMapping((QLineEdit *)wo, x);
// else
// E T C ...
}
}


Цитата(Litkevich Yuriy @ 10.2.2017, 6:09) *
зачем
model->submitAll();
Если уже есть
formChild->dataMapper->submit();

Х З
Подскажи как будет правильно ?

На картинке накладная сформированная динамически этим класом.
Поля накладной с БД связаны ф-ей mapDynaProperty()
Класс рекурсивный, т.е. и список и форма - это объекты этого класа.
Модель одна на двоих ...
Кто из них (список или форма) должен отвечать за редактирование/добавление записи ?
Подскажи плз, как сделать правильно ? Похожих примеров не нашёл :-(

Сообщение отредактировал JohnZ - 10.2.2017, 16:18
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.2.2017, 7:07
Сообщение #4


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

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

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




Репутация:   94  


Цитата(JohnZ @ 10.2.2017, 15:20) *
Кто из них (список или форма) должен отвечать за редактирование/добавление записи ?
тут нужно ориентироваться на логику взаимодействия с пользователем, которую задумал разработчик программы.

Т.е. если пользователь может изменить запись только во всплывающем окошке, значит в этом окошке и должно происходить изменение модели. По нажатию кнопки "Ок" делать submit() у QDataWidgetMapper-а


Смотри пример Qt sql/sqlwidgetmapper
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 14.2.2017, 14:20
Сообщение #5


Участник
**

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

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




Репутация:   0  


Юра, тогда такой вопрос, в первом окне, то которое список, получается QDataWidgetMapper не нужен вообще ?

Пример смотрел (давно), в примере "статика", нужна "динамика" :-)

Сообщение отредактировал JohnZ - 14.2.2017, 14:22
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.2.2017, 6:19
Сообщение #6


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

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

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




Репутация:   94  


Цитата(JohnZ @ 14.2.2017, 16:20) *
получается QDataWidgetMapper не нужен вообще ?
ну он нужен только, чтобы поля формы-редактора связать с моделью.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
JohnZ
  опции профиля:
сообщение 16.3.2017, 21:49
Сообщение #7


Участник
**

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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 15.2.2017, 6:19) *
Цитата(JohnZ @ 14.2.2017, 16:20) *
получается QDataWidgetMapper не нужен вообще ?
ну он нужен только, чтобы поля формы-редактора связать с моделью.

Юра, тогда для правильного сохранения данных, всё-таки необходимо сделать dataMapper->submit(); а уж затем записать
всё это безобразие на диск с пом-ю model->submitAll(); ?
Ведь у меня в первой месаге именно так и сделано !
dataMapper->submit() на диск не пишет ?

Сообщение отредактировал JohnZ - 16.3.2017, 21:49
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




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