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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QSqlRelationalTableModel и QTableView  (Прочитано 3638 раз)
d-bosh
Гость
« : Апрель 24, 2011, 15:42 »

Есть база данных на несколько таблиц.
С ними я работаю через QTableView, через модель QSqlRelationalTableModel. В качестве ItemDelegate я использую QSqlRelationDelegate. Благодаря этому получаю комбобокс прямо в таблице на форме, в котором я могу выбирать все значения, доступные в этом поле (а они определяются из другой таблицы с помощью FOREIGN KEY автоматически этим delegate'ом).
Есть следующая проблема, при попытке получить данные выделенной строки в QTableView, я получаю все данные из ячеек, кроме тех в которых установленo setRelation ( вместо данных пустые значнения).
Как получить эти данные из связных таблиц?
Записан
d-bosh
Гость
« Ответ #1 : Апрель 24, 2011, 21:32 »

Код:
void MainWindow::init(){
    connection=Connection::getInstance();
    ui->tableView->viewport()->installEventFilter(this);
    model = new QSqlRelationalTableModel(0,connection->getDB());
    model->setHeaderData(0, Qt::Horizontal, tr("id"));
    model->setHeaderData(1, Qt::Horizontal, tr("name"));
    model->setHeaderData(2, Qt::Horizontal, trUtf8("assort"));
    model->setTable("table1");
    model->setRelation(2, QSqlRelation("tasrt", "id", "name_as"));
    model->select();

    ui->tableView->setModel(model);
    ui->tableView->setColumnHidden(0,true);
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableView->setItemDelegate(QSqlRelationalDelegate(ui->tableView));
    ui->tableView->resizeColumnsToContents();
    ui->tableView->resizeRowsToContents();
    ui->tableView->show();

}

void MainWindow::saveSettings(){
QItemSelectionModel *selectionModel = ui->tableView->selectionModel();
QModelIndexList indexes = selectionModel->selectedRows();
QModelIndex index;
 foreach (index, indexes) {
  QSqlRecord record = model->record(index.row());
  QString settings_file;
  settings_file.append(record.value("name").toString()).append("\n");
  settings_file.append(record.value("name_as").toString()).append("\n");
 qDebug()<<settings_file;
}
}

удалось получить индекс из связной таблицы, как получить значение по этому индексу?
Записан
maint
Гость
« Ответ #2 : Апрель 25, 2011, 04:31 »

самый простой вариант QSqlQuery с select
Записан
TanKis
Гость
« Ответ #3 : Май 05, 2011, 17:27 »

у меня такой подход работает

Код:
bool mymodel::setData(const QModelIndex &index, const QVariant &value, int  role )
 {
     if (index.column() == 0 )
         return false;
     QModelIndex primaryKeyIndex = QSqlRelationalTableModel::index(index.row(), 0);
     QString count_ = data(primaryKeyIndex).toString();
 
     bool ok;


switch(index.column())
{

case 1:


update_c =  QString ("mycolumn1=' ");
break;

case 2:

                      update_c =  QString ("mycolumn2=' ");
break;

case 3:...


break;
}


ok = setTable(count_,value.toString(),update_c);
           refresh();
          return ok;
 }

 //-----обновление данных в таблице----
 void mymodel::refresh()
 {
QSqlQuery query1;
query1.exec("select * from mytable");
            setQuery(query1);


 }

 //-------------заполнение таблицы новыми данными-----------
 bool mymodel::setTable( const QString &count_,const QString &parameter,const QString &update_c)
 {
                       update_table =  QString ("update mytable set ");
                       update_count   =  QString (" ' where count=' ");
QSqlQuery query2;
query2.prepare(update_table+update_c+parameter+update_count+count_+"'");
query2.addBindValue(parameter);
query2.addBindValue(count_);
query2.exec();

return query2.exec();

 }
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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