crossplatform.ru

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


  Ответ в QDataWidgetMapper и несколько QCombobox
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
iCast Дата 21.7.2017, 12:26
 
Цитата(Алексей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
Алексей1153 Дата 21.7.2017, 7:33
  iCast, можно предположить, что model->fieldIndex("car_name") и model->fieldIndex("task_name") возвращают одинаковые значения. Проверь
iCast Дата 21.7.2017, 0:30
  Всем привет, столкнулся с такой проблемой.
Редактирую данные модели через 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
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 4.12.2020, 5:13