Возникла проблема, что после внесения данных в таблицы, до закрытия программы, они в других таблицах не отображаются.
Например, есть справочная таблица, в которую вношу данные и записываю их в БД (да, они в БД записаны, я это проверял), потом открываю форму, которая должна эти данные использовать у себя, а они там не отображаются, то есть после сохранения данных обновления не происходит.
Немного о структуре программы:
В файле mainwindow.h объявлены следующие переменные для окон:
genusPlantD* genPlantD;
researcherD* researchD;
openProjectD* openPrD;
addEditProject* aeProj; //добавление/редактирование проекта
Соответственно, при нажатии пункт меню выполняется следующий код:
void MainWindow::ht_genusPlants()
{
genPlantD = new genusPlantD();
genPlantD->show();
}
в этом месте я добавляю справочную информацию и сохраняю всё (в БД запись появляется).
Когда же я вызываю, например, добавление/редактирование проекта (addEditProject* aeProj; ) или в окне openProjectD* openPrD; делаю редактирование проекта, то в combobox новые данные не появляются.
Сейчас, при создании проекта (addEditProject* aeProj; ) при нажатии в нём на кнопку сохранить выполняется код:
void db::PlantStore(QString name, QString descr, QString gps, QString typeP, QString genusP, QString age, QString cipher, QString variety, QString whoAdded, QDate dateAdded)
{
qDebug() << "db::PlantStore .....";
QSqlQuery* sq = new QSqlQuery(sdb->getDB());
strQuery = "INSERT INTO plants (title, description, gps, type_plant_id, genus_plant_id,"
"age, cipher, variety, who_added_id, date_added) VALUES ('"+name+"','"+descr+"','"+
gps+"','"+typeP+"','"+genusP+"','"+age+"','"+cipher+"','"+variety+
"','"+whoAdded+"','"+dateAdded.toString("yyyy-MM-dd")+"')";
sq->exec(strQuery);
}
а для того, чтобы в окне openProjectD* openPrD; отобразились данные нового проекта, из addEditProject* aeProj; я посылаю сигнал в главное окно:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), ui(new Ui::MainWindow)
{
ui->setupUi(this);
.....
openPrD = new openProjectD(); //для открытия проекта
aeProj = new addEditProject();
.......
connect(aeProj,SIGNAL(sendOnlyCreateProjectSignal()),
this, SLOT(afterCreateNewProject()));
}
которое выполняет слот:
void MainWindow::afterCreateNewProject()
{
openPrD = new openProjectD();
}
и после этого в openProjectD* openPrD; я вижу данные, которые записал SQL запросом.
Если на каждое изменение данных создавать новый экземпляр по сигналу, это не есть хорошо...
Но кажется это такой велосипед, что я не прав и есть способ сделать более изящно, например, переподключением к базе данных.
Что посоветуете?
P.S> данные в комбобокс заношу следующим образом:
QMultiMap<QString, QString> db::researchList_Term()
{
QString id, fio;
QSqlQuery *p_Query = new QSqlQuery("SELECT id, fio FROM researcher", sdb->getDB());
QSqlRecord record;
QMultiMap<QString,QString> rMap;
while(p_Query->next()){
record=p_Query->record();
id=record.value("id").toString();
fio=record.value("fio").toString();
rMap.insert(id, fio);
}
return rMap;
}
и добавляю в ComboBox:
void addEditProject::reportResearcher()
{
researchMap = myDB->researchList_Term();
QMultiMap<QString, QString>::iterator it = researchMap.begin();
for (;it != researchMap.end(); ++it) {
ui->researcher_cb->addItem(it.value());
ui->researcher2_cb->addItem(it.key());
}
}
После этого второй комбобокс делаем скрытым, а в Designer выставляет сигналы и слоты на изменение значений комбобокса.