Russian Qt Forum
Ноябрь 23, 2024, 21:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как связать QSqlRelationalTableModel и QComboBox  (Прочитано 4549 раз)
registrationfedser87
Гость
« : Июль 07, 2008, 15:20 »

Есть две таблицы: этапы и жидкости. В таблице 'Этапы' есть поле которое указывает на жидкость из таблицы "Жидкости". В QComboBox отображаются все жидкости из таблицы "Жидкости" использую отношение между таблицами. Как сделать так чтобы при изменении названии в жидкости в таблице "Жидкости" через QTableView эти изменения были видны в QComboBox?
Вот код создания модели таблицы "Жидкости" и связанной модели таблицы  'Этапы':
Код:
liquidModel = new QSqlTableModel;
liquidModel->setEditStrategy(QSqlTableModel::OnFieldChange);
liquidModel->setTable("Liquid"); //таблица Жидкости
liquidModel->select();

QSqlRelationalTableModel *stageModel;//этапы
stageModel = new QSqlRelationalTableModel(0);
stageModel->setEditStrategy(QSqlTableModel::OnFieldChange);
stageModel->setTable("Stage");
     
int liquidId_in_stageModel=stageModel->fieldIndex("idLiquid_FK");
//установка отношений между связанными таблицами
stageModel->setRelation(liquidId_in_stageModel, QSqlRelation("Liquid", "id", "Name"));
stageModel->setRelation(stageModel->fieldIndex("idProject_FK"), QSqlRelation("Project", "id", "id"));
stageModel->select();

Вот код отображения таблицы Жидкости:
Код:
ui.tableView_liquids->setModel(liquidModel);	
ui.tableView_liquids->setColumnHidden(liquidModel->fieldIndex("id"), true);
ui.tableView_liquids->horizontalHeader()->hide();
ui.tableView_liquids->verticalHeader()->hide();
ui.tableView_liquids->resizeRowsToContents();
ui.tableView_liquids->resizeColumnsToContents();

QDataWidgetMapper *mapperLiquid = new QDataWidgetMapper(this);
mapperLiquid->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
mapperLiquid->setModel(liquidModel);
mapperLiquid->addMapping(ui.lineEdit_liquidName, liquidModel->fieldIndex("Name"));


connect(ui.tableView_liquids->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
             mapperLiquid, SLOT(setCurrentModelIndex(QModelIndex)));
ui.tableView_liquids->setCurrentIndex(liquidModel->index(0, 0));

Вот код отображения таблицы Этапы:
Код:
ui.listView_stages->setModel(stageModel);
ui.listView_stages->setModelColumn(stageModel->fieldIndex("Name"));
ui.tableViewStage->setModel(stageModel);
ui.comboBox_liquid_names->setModel(stageModel->relationModel(liquidId_in_stageModel));      ui.comboBox_liquid_names->setModelColumn(stageModel->relationModel(liquidId_in_stageModel)->fieldIndex("name"));

QDataWidgetMapper *mapperStage = new QDataWidgetMapper(this);
mapperStage->setModel(stageModel);
mapperStage->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
mapperStage->setItemDelegate(new QSqlRelationalDelegate(mapperStage));

mapperStage->addMapping(ui.lineEdit_stage_name, stageModel->fieldIndex("Name"));
mapperStage->addMapping(ui.comboBox_liquid_names, liquidId_in_stageModel);
connect(ui.listView_stages->selectionModel(), SIGNAL(currentRowChanged(QModelIndex,QModelIndex)),
             mapperStage, SLOT(setCurrentModelIndex(QModelIndex)));
Записан
developer
Гость
« Ответ #1 : Июль 07, 2008, 17:00 »

А ты попробуй сигнал из нужной модели отловить, и в слоте который этот сигнал будет обрабатывать, обнови QComboBox но желательно перед обновлением комбо его полностью очистить
Записан
registrationfedser87
Гость
« Ответ #2 : Июль 08, 2008, 08:58 »

Так не получается-при очистке QComboBox он очищает и модель с ним связанную(в данном случае модель таблицы "Жидкости").Пробовал методом clear() и методом removeItem(i)-результат один и тот же.
Записан
developer
Гость
« Ответ #3 : Июль 08, 2008, 10:12 »

А ты попробуй комбо не через модель заполнять а просто так,( и еще если полностью очищаеться модель то надо ее снова полностью заполнить). Я вообще то делал так - с помощью QSqlQuery делал нужную виборку, потом в цикле из етой виборки вставлял елементы в комбо, но перед вставкою очищал комбо. Всю ету процедуру я оформил как функцию, и вызывал ее тогда когда нужно было обновить данные  в комбо.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 21.