@krox
аспирант, программист, исследователь

QT: как обновить БД, после выполнения запросов?

Возникла проблема, что после внесения данных в таблицы, до закрытия программы, они в других таблицах не отображаются.
Например, есть справочная таблица, в которую вношу данные и записываю их в БД (да, они в БД записаны, я это проверял), потом открываю форму, которая должна эти данные использовать у себя, а они там не отображаются, то есть после сохранения данных обновления не происходит.
Немного о структуре программы:

В файле 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 выставляет сигналы и слоты на изменение значений комбобокса.
  • Вопрос задан
  • 815 просмотров
Пригласить эксперта
Ответы на вопрос 1
kkmspb
@kkmspb
хобби C++, Qt, десктоп, микроконтроллеры STM32
Если вы вносите в базу данных изменения через QSqlQuery это по сути мимо модели данных, то вам надо делать select потом вручную для модели данных.
Кстати у нас есть развитие классов QSqlTableModel и QTableView, выложено здесь на хабре, там добавлено много нужного функционала.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы