crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

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


Последние 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 Рейтинг@Mail.ru Текстовая версия Сейчас: 15.7.2025, 9:53