Russian Qt Forum

Qt => Model-View (MV) => Тема начата: arial от Октябрь 08, 2009, 09:08



Название: Обновить relationModel для QSqlRelationalTableModel
Отправлено: 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, но я не знаю как.



Название: Re: Обновить relationModel для QSqlRelationalTableModel
Отправлено: break от Октябрь 20, 2009, 03:28
а если в вашем делегате переопределить еще и метод paint - для отрисовки данных когда ячейка не в режиме редактирвания и обновлять все и выводить в нем не используя QSqlRelation ???


Название: Re: Обновить relationModel для QSqlRelationalTableModel
Отправлено: kkmspb от Февраль 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 (https://github.com/PavelDorofeev/Fork-Sql-Qt-4.8.1--SQLite-3--relations--calc-fields)