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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обновление отображения базы в QTableView  (Прочитано 10122 раз)
eXeLe
Гость
« : Август 24, 2012, 12:19 »

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

смотрел в сторону QDataWidgetMapper, но как я понял, оно просто дает работать с тем или иным полем таблицы, а у меня идут запросы в стиле "для строки с таким то имненем, увеличить показатель value на x" или банально добавление новых строк.
Записан
LEO
Гость
« Ответ #1 : Август 24, 2012, 12:32 »

может что то типо этого?

tableView->reset();
Записан
eXeLe
Гость
« Ответ #2 : Август 24, 2012, 12:38 »

пробовал и reset(); и update(); но либо использую неправильно, либо нифига не работает оно у меня
Записан
Bepec
Гость
« Ответ #3 : Август 24, 2012, 12:41 »

submitAll  не пробовали?
Записан
fte
Гость
« Ответ #4 : Август 24, 2012, 13:02 »

QSqlTableModel::select()
Записан
eXeLe
Гость
« Ответ #5 : Август 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();
}

на что программа в итоге никак не реагирует, но база обновляется после перезапуска.
« Последнее редактирование: Август 24, 2012, 13:46 от eXeLe » Записан
LEO
Гость
« Ответ #6 : Август 24, 2012, 14:10 »

как я понял тебе надо сделать обновление таблицы, а у тебя это собственно и не выходит,
здесь такая тема рассматривалась
http://www.prog.org.ru/topic_9086_0.html
Записан
eXeLe
Гость
« Ответ #7 : Август 24, 2012, 14:41 »

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

сменил QSqlTableModel на QSqlQueryModel
пробую выполнить своб замену таким образом:
Код:
model->setQuery(QString("update bdName set Pole1 = %1 where Pole2 = %2").arg(usrValue->text()).arg(usrName->text()));
но в итоге таблица вовсе исчезает и становится пустой, а вместо трех столбцов, остаются два.
Записан
virtual_root
Гость
« Ответ #9 : Август 24, 2012, 15:01 »

попробуй так
Код:
 ui->tableView->model()->submit();
может поможет. Я так делала,у меня всё обновлялось.
Записан
eXeLe
Гость
« Ответ #10 : Август 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(); был необходим, иначе отображалась пустая база.
Записан
fte
Гость
« Ответ #11 : Август 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;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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