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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Обновить relationModel для QSqlRelationalTableModel  (Прочитано 4217 раз)
arial
Гость
« : Октябрь 08, 2009, 09:08 »

Имеется таблица в базе данных, которая называется "Persons", которая хранит в себе, например, список клиентов.
В этой таблице есть поле "NameId", которое хранит внешний ключ на таблицу "Names", которая хранит в себе имена клиентов.

Создаю QTableView, к которому через QSqlRelationalTableModel привязана таблица "Persons".

Написал делегат для колонки "NameId", редактор которого представляет из себя QLineEdit, который отображает имя из таблицы "Names".

Теперь при вписывании в эту колонку имени клиента, метод setModelData делегата ищет в таблице "Names" вписанное имя, и, если находит, то подставляет в колонку "NameId" его идентификатор, если нет, то сначала создаёт новую запись с новым именем, получает его идентификатор а уже потом вписывает его в колонку "NameId".

Вот код метода setModelData:

Код
C++ (Qt)
void PersonItemEditor::setModelData(QWidget *parent, QAbstractItemModel *model, const QModelIndex &index) const
{
       QLineEdit *editor = static_cast<QLineEdit *>(parent);
       QString name = editor->text();
 
       QSqlRelationalTableModel *personsModel = static_cast<QSqlRelationalTableModel *>(model);
 
       QSqlTableModel *namesModel = personsModel->relationModel(index.column());
 
       // Вырезаю здесь большой кусок кода, смысл которого сводится к тому,
       // что в namesModel ищется name и возвращается его идентификатор, а, если
       // не находится, то добавляется новая запись и вызывается namesModel->submitAll();.
       // В итоге получаю переменную int personId с идентификатором.
 
       model->setData(index, personId);
}

В итоге после отработки этого кода, если имя найдено в таблице "Names", то проблем нет, оно отображается. Проблемы начинаются, если имя не найдено. В namesModel из вышеприведённого кода новое имя добавляется, в таблице базы данных я его вижу, personId получает идентификатор, с этим тоже проблем нет, но после model->setData(index, personId); вновь введённое имя не отображается. Видимо нужно как-то обновить relationModel в QSqlRelationalTableModel, но я не знаю как.

Записан
break
Гипер активный житель
*****
Offline Offline

Сообщений: 846


Просмотр профиля
« Ответ #1 : Октябрь 20, 2009, 03:28 »

а если в вашем делегате переопределить еще и метод paint - для отрисовки данных когда ячейка не в режиме редактирвания и обновлять все и выводить в нем не используя QSqlRelation Непонимающий
Записан
kkmspb
Новичок

Offline Offline

Сообщений: 4


Просмотр профиля
« Ответ #2 : Февраль 03, 2023, 19:00 »

Состоялось интересное развитие классов QSqlTableModel и QTableView на старом добром Qt 4.8.1 в виде новых классов типа PblSqlRelationalTableModel и PblTableView. Там есть и готовый класс PblTableDlg, который включает полноценный функционал управления таблицей: вставка , удаление, копирование строки, поиск, отбор по значению и самое приятное внешние связи с другими таблицами для подстановки текстовых значений вместо  ID реализованы внутри классов и работают автоматически.
Проект открытый свободный, развивается уже не один год, выложен на гитхабе

https://github.com/PavelDorofeev/Fork-Sql-Qt-4.8.1--SQLite-3--relations--calc-fields
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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