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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTableView, QSqlRelationalTableModel. Выборка из нескольких таблиц. Как?  (Прочитано 6515 раз)
smartchecker
Гость
« : Май 21, 2012, 16:55 »

Сейчас сделано так.
Есть ещё одна таблица(formats), которая связана с books через промежуточную таблицу (library).
library {
  book_id
  format_id
  и ещё несколько полей.
}

Мне нужно в QTableView напротив каждой книги ставить формат.

Как описать модель?
Код
C++ (Qt)
   modelBooks = new QSqlRelationalTableModel(this, db);
   modelBooks->setTable("books");
   modelBooks->setEditStrategy(QSqlTableModel::OnManualSubmit);
 
   seriesIndex = modelBooks->fieldIndex("series_id");
   modelBooks->setRelation(seriesIndex, QSqlRelation("series", "id", "series"));
 
   langsIndex = modelBooks->fieldIndex("langs_id");
   modelBooks->setRelation(langsIndex, QSqlRelation("langs", "id", "language"));
 
   publishersIndex = modelBooks->fieldIndex("publisher_id");
   modelBooks->setRelation(publishersIndex, QSqlRelation("publishers", "id", "publisher"));
 
   if (!modelBooks->select()) {
       showError(modelBooks->lastError());
       return;
   }
 
   modelBooks->setHeaderData(1, Qt::Horizontal, QObject::trUtf8("Название"));
   modelBooks->setHeaderData(3, Qt::Horizontal, QObject::trUtf8("Год"));
 
   ui->tableViewBooks->setModel(modelBooks);
   ui->tableViewBooks->resizeColumnsToContents();
   ui->tableViewBooks->setCurrentIndex(modelBooks->index(0, 0));
   ui->tableViewBooks->setColumnHidden(0, true);
   ui->tableViewBooks->setColumnHidden(5, true);
   ui->tableViewBooks->setSelectionBehavior(QAbstractItemView::SelectRows);
   ui->tableViewBooks->setSelectionMode(QAbstractItemView::SingleSelection);
   ui->tableViewBooks->horizontalHeader()->setResizeMode(QHeaderView::Stretch);
 
Записан
trot
Гость
« Ответ #1 : Май 22, 2012, 07:50 »

напиши правильный запрос  - select b.*, f.* from books b, library l, formats f where b.book_id=l.book_id and l.format_id=f.format_id
и в результате будет напротив каждой книги свой формат.
Записан
smartchecker
Гость
« Ответ #2 : Май 22, 2012, 09:44 »

напиши правильный запрос  - select b.*, f.* from books b, library l, formats f where b.book_id=l.book_id and l.format_id=f.format_id
и в результате будет напротив каждой книги свой формат.
Запрос-то написать я могу, но как будет отслеживаться добавление новых данных в модель?
Или и для этого писать запрос? Смысл использования QSqlRelationalTableModel, на мой взгляд, не в этом.
Записан
trot
Гость
« Ответ #3 : Май 22, 2012, 13:27 »

QSqlRelationalTableModel нужен для того, чтобы выбрать значение из списка при редактировании ячейки. А ты хочешь отображать
Код:
напротив каждой книги ставить формат
Записан
smartchecker
Гость
« Ответ #4 : Май 22, 2012, 14:32 »

QSqlRelationalTableModel нужен для того, чтобы выбрать значение из списка при редактировании ячейки. А ты хочешь отображать
Код:
напротив каждой книги ставить формат
Э-э... QSqlRelationalTableModel - описывает модель данных (т.е. связи разных сущностей), которую я хочу отображать в QTableView.
В данном случае вместо id соотв. формата я хочу подставить его картинку.
Я немного изменил схему базы, и теперь промежуточной таблицы нет.
Теперь это выглядит так.
Код
C++ (Qt)
   formatIndex = modelBooks->fieldIndex("format_id");
   modelBooks->setRelation(formatIndex, QSqlRelation("formats", "id", "mimetype"));
 
И задача в соотв. ячейке таблицы отобразить маленькую иконку из поля BLOB.
Записан
Alex_C
Гость
« Ответ #5 : Май 25, 2012, 23:59 »

Запрос-то написать я могу, но как будет отслеживаться добавление новых данных в модель?
Или и для этого писать запрос? Смысл использования QSqlRelationalTableModel, на мой взгляд, не в этом.

Никак не будет. Да и как ты себе это представляешь? Ты изменил данные в сторонней таблице (может даже в другой программе) - а они должны мистическим образом оказаться у тебя в программе? Не в плане рекламы - очень это хорошо описано в книге http://www.prog.org.ru/topic_765_225.html - последнее сообщение от меня.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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