crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QDataWidgetMapper и несколько QCombobox
iCast
  опции профиля:
сообщение 21.7.2017, 0:30
Сообщение #1


Студент
*

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

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




Репутация:   0  


Всем привет, столкнулся с такой проблемой.
Редактирую данные модели через QDataWidgetMapper.
После того как сделал все приготовления, соединяю поля модели и вид:
QSqlTableModel *modelTask = model->relationModel(model->fieldIndex("task_name"));
ui->task->setModel(modelTask);
ui->task->setModelColumn(modelTask->fieldIndex("name"));

QSqlTableModel *modelCar = model->relationModel(model->fieldIndex("car_name"));
ui->car->setModel(modelCar);
ui->car->setModelColumn(modelCar->fieldIndex("name"));
//....
mapper->setModel(model);
mapper->setItemDelegate(new QSqlRelationalDelegate(this));
mapper->addMapping(ui->dateEdit,model->fieldIndex("date"));
mapper->addMapping(ui->task,model->fieldIndex("task_name"));
mapper->addMapping(ui->car,model->fieldIndex("car_name"));

ui->task и ui->car - это 2 комбобокса.
Когда срабатывает mapper->submit() меняются данные в модели, из комбобокса ui->task, но если поменять местам строки
mapper->addMapping(ui->car,model->fieldIndex("car_name"));
mapper->addMapping(ui->task,model->fieldIndex("task_name"));

то наоборот, данные обновляются из комбобокса ui->car, но не обновляются в ui->task.

Быть может я что-то делаю не так? Потому что маппер работает с несколькими lineEdit, но не в какую не хочет работать с несколькими QCombobox.
Версия Qt: 5.9.0
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 21.7.2017, 7:33
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2901
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

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




Репутация:   34  


iCast, можно предположить, что model->fieldIndex("car_name") и model->fieldIndex("task_name") возвращают одинаковые значения. Проверь

Сообщение отредактировал Алексей1153 - 21.7.2017, 7:33
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
iCast
  опции профиля:
сообщение 21.7.2017, 12:26
Сообщение #3


Студент
*

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

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




Репутация:   0  


Цитата(Алексей1153 @ 21.7.2017, 7:33) *
iCast, можно предположить, что model->fieldIndex("car_name") и model->fieldIndex("task_name") возвращают одинаковые значения. Проверь

qDebug() <<model->fieldIndex("task_name") << model->fieldIndex("car_name"); // 5 2

Все в порядке, сравнивая с таблицей

Наверно нужно подробнее расписать. Есть слот, для редактирования:
Раскрывающийся текст
mainwindow.cpp
void MainWindow::updateListAuto()
{
    modelListAuto = new QSqlRelationalTableModel(viewListAuto);
    modelListAuto->setTable("list_cars");
    modelListAuto->setEditStrategy(QSqlTableModel::OnFieldChange);
    modelListAuto->setJoinMode(QSqlRelationalTableModel::LeftJoin);
    modelListAuto->setRelation(modelListAuto->fieldIndex("car_id"), QSqlRelation("cars", "id", "name AS car_name"));
    modelListAuto->setRelation(modelListAuto->fieldIndex("task_id"), QSqlRelation("tasks", "id", "name AS task_name"));
    modelListAuto->select();
    viewListAuto->setModel(modelListAuto);
    viewListAuto->show();
}

..
{
    QModelIndex index = viewListAuto->selectionModel()->currentIndex();
    ListAuto * dlg = new ListAuto(this,"edit"); // диалоговое окно с редактированием
    dlg->setAttribute(Qt::WA_DeleteOnClose);
    dlg->setModel(modelListAuto);//отправляем модель
    dlg->mapper->setCurrentModelIndex(index);//текущий индекс
    dlg->exec();
}
..

listauto.cpp
void ListAuto::setModel(QSqlRelationalTableModel *model)
{


    QSqlTableModel *modelTask = model->relationModel(model->fieldIndex("task_name"));
    ui->task->setModel(modelTask);
    ui->task->setModelColumn(modelTask->fieldIndex("name"));

    QSqlTableModel *modelCar = model->relationModel(model->fieldIndex("car_name"));
    ui->car->setModel(modelCar);
    ui->car->setModelColumn(modelCar->fieldIndex("name"));

    mapper->setModel(model);
    mapper->setItemDelegate(new QSqlRelationalDelegate(this));
    mapper->addMapping(ui->dateEdit,model->fieldIndex("date"));
    mapper->addMapping(ui->task,model->fieldIndex("task_name"));
    mapper->addMapping(ui->car,model->fieldIndex("car_name"));
}
void ListAuto::done(int r)
{
    if(QDialog::Accepted == r) {
        if(_mode == "add" and mapper->submit()) {
            QDialog::done(r);
            return;
        }
        else if(_mode == "edit" and mapper->submit() ){
            QDialog::done(r);
            return;
        }
        else {
            QMessageBox::critical(this,tr("Error"),tr("Error %1 list").arg(_mode == "add" ? "adding" : "editing"));
            return;
        }
    }
    else {
        QDialog::done(r);
        return;
    }
}


UPD
если убрать политику ManualSubmit
//mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);

все комбобоксы обновляются, но на ходу, а хотелось бы по кнопке...

UPD2
Проблема решена.
Совсем проглядел политику в строке где обновляю модель:
modelListAuto->setEditStrategy(QSqlTableModel::OnFieldChange);
OnFieldChange -> OnManualSubmit
И да, не стоит забывать после того как делаем mapper->submit() сохранить в модели все это model->submitAll(); и политику маппера можно вернуть ManualSubmit

Сообщение отредактировал iCast - 21.7.2017, 16:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 28.10.2020, 8:07