Russian Qt Forum

Qt => Базы данных => Тема начата: eXeLe от Август 24, 2012, 12:19



Название: Обновление отображения базы в QTableView
Отправлено: eXeLe от Август 24, 2012, 12:19
собссно возник вопрос.
работаю с базой через запросы
Код:
QSqlQuery query;
...
параллельно надо иногда просматривать содержимое базы. вызываю окошко через QSqlTableModel - QTableView, где она отображается.
но все измнения, вносимые через запросы, отображаются только после перезапуска программы.
как исправить?

смотрел в сторону QDataWidgetMapper, но как я понял, оно просто дает работать с тем или иным полем таблицы, а у меня идут запросы в стиле "для строки с таким то имненем, увеличить показатель value на x" или банально добавление новых строк.


Название: Re: Обновление отображения базы в QTableView
Отправлено: LEO от Август 24, 2012, 12:32
может что то типо этого?

tableView->reset();


Название: Re: Обновление отображения базы в QTableView
Отправлено: eXeLe от Август 24, 2012, 12:38
пробовал и reset(); и update(); но либо использую неправильно, либо нифига не работает оно у меня


Название: Re: Обновление отображения базы в QTableView
Отправлено: Bepec от Август 24, 2012, 12:41
submitAll  не пробовали?


Название: Re: Обновление отображения базы в QTableView
Отправлено: fte от Август 24, 2012, 13:02
QSqlTableModel::select()


Название: Re: Обновление отображения базы в QTableView
Отправлено: eXeLe от Август 24, 2012, 13:40
сижу, штота пробую, мало что выходит.
обащя конструкция примерно такая:
Код:
myBD::myBD(const QString& bd, QWidget* wid1) : QWidget(wid1)
{
    model = new QSqlTableModel;
    model->setTable(bd);
    model->select();
    model->setEditStrategy(QSqlTableModel::OnFieldChange);
    model->setHeaderData(0, Qt::Horizontal, QObject::tr("ID"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Pole1"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("Pole2"));

    QTableView *view = new QTableView;
    view->setModel(model);
    view->setColumnHidden(0, true);
    setWindowTitle(tr("Baza dannih"));

    QPushButton *quitButton = new QPushButton("&Exit");
    QObject::connect(quitButton, SIGNAL(clicked()), this, SLOT(close()));
    QHBoxLayout *buttonLayout = new QHBoxLayout;
    buttonLayout->addWidget(quitButton);
    usrName = new QLineEdit;
    usrValue = new QDoubleSpinBox;
    buttonLayout->addWidget(usrName);
    buttonLayout->addWidget(usrValue);

    QPushButton *upd2Button = new QPushButton("&Update");
    QObject::connect(upd2Button, SIGNAL(clicked()), this, SLOT(updateString()));
    buttonLayout->addWidget(upd2Button);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addWidget(view);mainLayout->addLayout(buttonLayout);
    setLayout(mainLayout);
    resize(600,500);
}

bool myBD::updateString(){
    QSqlQuery query;
    query.prepare("update bdName set Pole1 = ? where Pole2 = ?");
    query.addBindValue(usrValue->text());
    query.addBindValue(usrName->text());
    model->submitAll();
    return query.exec();
}

на что программа в итоге никак не реагирует, но база обновляется после перезапуска.


Название: Re: Обновление отображения базы в QTableView
Отправлено: LEO от Август 24, 2012, 14:10
как я понял тебе надо сделать обновление таблицы, а у тебя это собственно и не выходит,
здесь такая тема рассматривалась
http://www.prog.org.ru/topic_9086_0.html (http://www.prog.org.ru/topic_9086_0.html)


Название: Re: Обновление отображения базы в QTableView
Отправлено: eXeLe от Август 24, 2012, 14:41
как я понял тебе надо сделать обновление таблицы, а у тебя это собственно и не выходит,
здесь такая тема рассматривалась
http://www.prog.org.ru/topic_9086_0.html (http://www.prog.org.ru/topic_9086_0.html)
именно. топик видел, пробовал делать функцию c this->reset, но в ответ выдает
‘class myBD’ has no member named ‘reset’


Название: Re: Обновление отображения базы в QTableView
Отправлено: eXeLe от Август 24, 2012, 14:58
сменил QSqlTableModel на QSqlQueryModel
пробую выполнить своб замену таким образом:
Код:
model->setQuery(QString("update bdName set Pole1 = %1 where Pole2 = %2").arg(usrValue->text()).arg(usrName->text()));
но в итоге таблица вовсе исчезает и становится пустой, а вместо трех столбцов, остаются два.


Название: Re: Обновление отображения базы в QTableView
Отправлено: virtual_root от Август 24, 2012, 15:01
попробуй так
Код:
 ui->tableView->model()->submit();
может поможет. Я так делала,у меня всё обновлялось.


Название: Re: Обновление отображения базы в QTableView
Отправлено: eXeLe от Август 24, 2012, 15:52
в итоге все решилось вот так:

Код:
    QSqlQuery query;
    query.prepare("update bdName set Pole1 = ? where Pole2 = ?");
    query.addBindValue(usrValue->text());
    query.addBindValue(usrName->text());
    query.exec();
    model->clear();
    model->setQuery("SELECT * FROM bdName");

а конкретно clear(); был необходим, иначе отображалась пустая база.


Название: Re: Обновление отображения базы в QTableView
Отправлено: fte от Август 24, 2012, 15:56
Попробуй так....
Код
C++ (Qt)
bool myBD::updateString(){
   QSqlQuery query;
   query.prepare("update bdName set Pole1 = ? where Pole2 = ?");
   query.addBindValue(usrValue->text());
   query.addBindValue(usrName->text());
   bool ok = query.exec();
   if(ok)
       model->select();
   return ok;
}