Название: Как связать QSqlRelationalTableModel и QComboBox
Отправлено: 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)));
Название: Re: Как связать QSqlRelationalTableModel и QComboBox
Отправлено: developer от Июль 07, 2008, 17:00
А ты попробуй сигнал из нужной модели отловить, и в слоте который этот сигнал будет обрабатывать, обнови QComboBox но желательно перед обновлением комбо его полностью очистить
Название: Re: Как связать QSqlRelationalTableModel и QComboBox
Отправлено: registrationfedser87 от Июль 08, 2008, 08:58
Так не получается-при очистке QComboBox он очищает и модель с ним связанную(в данном случае модель таблицы "Жидкости").Пробовал методом clear() и методом removeItem(i)-результат один и тот же.
Название: Re: Как связать QSqlRelationalTableModel и QComboBox
Отправлено: developer от Июль 08, 2008, 10:12
А ты попробуй комбо не через модель заполнять а просто так,( и еще если полностью очищаеться модель то надо ее снова полностью заполнить). Я вообще то делал так - с помощью QSqlQuery делал нужную виборку, потом в цикле из етой виборки вставлял елементы в комбо, но перед вставкою очищал комбо. Всю ету процедуру я оформил как функцию, и вызывал ее тогда когда нужно было обновить данные в комбо.
|