Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Некорректное сохранение "tableView"
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
potkin
users.h
private:
    Ui::Users *ui;
    Glav gl;
    QSqlDatabase db;
    QSqlTableModel *model;


users.cpp
1.Отображение данных.
    db = QSqlDatabase::addDatabase(VarClass::Server);
    db.setHostName(VarClass::HostName);
    db.setDatabaseName(VarClass::DatabaseName);
    db.setUserName(VarClass::UserName);
    db.setPassword(VarClass::Passwor);
    if(db.open())
    {
        model = new QSqlTableModel(this, db);
        model->setTable("users");
        model->setHeaderData(0, Qt::Horizontal, "id");
        model->setHeaderData(1, Qt::Horizontal, "firstname");
        model->setHeaderData(2, Qt::Horizontal, "lastname");
        model->select();
        ui->tVUsers->setModel(model); //Это таблица "tableView"
        ui->tVUsers->resizeColumnsToContents();
        //db.close();
    }

поле id int not nul auto_increment, primary key (id)

2.Сохранение данных
    if(db.open())
    {
        model->submitAll();
    }


Проблема: изменяю записи и нажимаю баттон "Сохранить". Сохраняет все записи, кроме какой-то одной.
Litkevich Yuriy
а что возвращает
model->submitAll();
model->lastError()
?
potkin
Цитата(Litkevich Yuriy @ 15.8.2010, 2:20) *
а что возвращает
model->submitAll();
model->lastError()
?


Вот что:
Цитата
The database reported an error: Lost connection to MySQL server during query QMYSQL3: Unable to reset statement


Что это может быть ???
potkin
Есть таблица в БД "answer", которая содержит 10 полей, надо отобразить 2-а из них.
Делаю так:
    model = new QSqlRelationalTableModel();
    model->setTable("answer");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    if (model->select())
    {
       model->setHeaderData(0, Qt::Horizontal, tr("AnswerRU"));
       model->setHeaderData(1, Qt::Horizontal, tr("CorrectnessRU"));

       ui->tableView->setModel(model);
       ui->tableView->resizeColumnsToContents();
    }
    else
    {
        model->database().rollback();
        QMessageBox::warning(this, tr("Cached Table"), tr("The database reported an error: %1").arg(model->lastError().text()));
    }

Отображает все 10 полей.
molchanoviv
Надо показать 2 колонки из 10? Тогда во вьюшке спрячь колонки и все. QTableView::hideColumn(int)
potkin
Спасибо за ответы.
Подскажите ещё кое что.
Нужен номер выбраной строки в Таблице. В нете нашёл только это:
номер_выбраной_строки = view.currentIndex().row();

Не катит :(
molchanoviv
view.selectionModel()->selectedIndexes().at(номер строки в выделении).row()
Litkevich Yuriy
Цитата(potkin @ 26.8.2010, 13:44) *
Не катит
данная фраза не информативна.
Что выделил? Что получил в результате? И т.д.
molchanoviv
Если надо одну строку, то view.setSelectionMode(QAbstractItemView::SingleSelection); а затем view.selectionModel()->selectedIndexes().first().row() только не забудь проверить список на пустоту.
potkin
molchanoviv,
Спасибо всё заработало :)
molchanoviv
Тема переехала в раздел MVC
potkin
Продолжаю ...
Подскажите, как программно отредактировать, данные в ячейках.
Данные заполняют tableView так:
    model = new QSqlRelationalTableModel();
    model->setTable("answer");
    model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    if (model->select())
    {
       model->setHeaderData(0, Qt::Horizontal, tr("AnswerRU"));
       model->setHeaderData(1, Qt::Horizontal, tr("CorrectnessRU"));

       ui->tableView->setModel(model);
       ui->tableView->resizeColumnsToContents();
    }
    else
    {
        model->database().rollback();
        QMessageBox::warning(this, tr("Cached Table"), tr("The database reported an error: %1").arg(model->lastError().text()));
    }


Заранее спасибо :)
Litkevich Yuriy
после селекта, ролбэк не нужен - лишнее.
программное изменение осуществляется через метод setData интерисующей тебя модели.
potkin
    for(int i=0; i<model->rowCount(); i++)
    {
        QModelIndex index = model->index(i,1);
        modelAZ->setData(index, "Текст ...");
    }


П.С. Мало примеров в сети, в основном так, только общая информация :(
Litkevich Yuriy
Цитата(potkin @ 27.8.2010, 23:35) *
Мало примеров в сети, в основном так, только общая информация
примеры смотри в делегатах, они непосредственно с моделью взаимодействуют.
potkin
Всем спасибо за ответы :)
Продолжаю.
Есть Реляционная модель:
 QSqlRelationalTableModel *model;
model = new QSqlRelationalTableModel(this, db);
model->setTable("answer");
model->setEditStrategy(QSqlTableModel::OnManualSubmit);
model->setRelation(6, QSqlRelation("correctness", "correctnessID", "nameEN"));
if (model->select())
  {
      .................
      model->setHeaderData(5, Qt::Horizontal, tr("answerUA"));
      model->setHeaderData(6, Qt::Horizontal, tr("correctnessID"));  // Реляция
  }

Надо считать несколько записей и проверить их на валидность.
Считываю так:
for(int i=0; i<model->rowCount(); i++)
{
  QSqlRecord record = model->record(i);
//1.Считывает и проверяет Нормально
  if(record.value("answerUA").toString() == "ТЕКСТ")
   {
      .................
   }

//2.НЕ Считывает.
  if(record.value("correctnessID").toString() == "ТЕКСТ")
   {
      .................
   }
}


Тоесть "//2. ... " не работает.
"correctnessID", всегда пустое :( - НЕ СЧИТЫВАЕТ потому что оэто реляция 2-х таблиц.
А вот "answerUA" - нормально считывает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.