Имеется таблица в базе данных, которая называется "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, но я не знаю как.