2012-04-12 4 views
0

У меня есть QMainWindow с двумя QTableViews на нем. Каждый QTableView имеет свой собственный QSqlRelationalTableModel. В качестве стратегии редактирования для обеих моделей я использую OnManualSubmit. Обе модели попадают в одну и ту же базу данных и заполняются с использованием setTable (каждый раз попадает в другую таблицу), а затем select().QTableView не обновляет внешние ключи?

Модель для второй таблицы настроена с соответствующими вызовами setRelation, чтобы связать ее с таблицей, используемой для заполнения первой модели. На втором (дочернем) представлении я звоню view->setItemDelegate(new QSqlRelationalDelegate(view));

Все кажется отличным: данные, отображаемые в первом представлении, перечислены в раскрывающемся списке в соответствующем поле второго представления.

Моя проблема: когда я добавляю, редактирую или удаляю запись в первый (родительский) вид и сохраняю ее в базе данных, как мне обновить второе представление, чтобы выпадающее меню было точным?

Во втором (дочернем) представлении могут быть несохраненные изменения, и я не хочу их потерять, и я еще не хочу их сохранять. Я просто хочу, чтобы раскрывающийся список был обновлен соответствующим образом.

Я пробовал child_model->relationModel(fk_col)->select();, и это работает, но child_model->relationModel(fk_col)->columnCount(); указывает, что выбор работает во всех полях родительской таблицы, что кажется ненужным пессимизацией.

Это моя первая попытка использовать <QtSql> и QTableView, так что, возможно, мне не хватает чего-то фундаментального. Может быть, есть способ использовать одну и ту же модель для обоих представлений, и обновление происходит автоматически? Каким образом можно обновить раскрывающийся список детского просмотра?

ответ

0

Запрос, производимый QSqlRelationalTableModel, больше не содержит внешних ключей.

Например, с этой дб структурой:

CREATE TABLE countries (id, name); 
CREATE TABLE cities(id, name, id_country); 

запрос будет выглядеть следующим образом:

SELECT id, name, country_name FROM cities 
    LEFT JOIN countries ON id_country = countries.id; 

Это означает, запрос должен быть повторно выполняется для таблицы, чтобы быть обновлены, если объединенная таблица изменяется.

Для автоматического обновления, я думаю, вы бы:

  • использовать регулярные QSqlTableModel, чтобы фактические внешние ключи в модели,
  • написать QAbstractItemDelegate класс для отображения отображенного значения и для создания редактор QComboBox.
  • , чтобы вызвать перерисовку отображаемой области столбца в представлении всякий раз, когда изменяется первая модель.