Qt C++ - отображение данных в одном представлении из нескольких таблиц SQLite

Версия Qt: 5.8

Допустим, у меня есть следующие таблицы SQL.

-- People
person_id | first_name | last_name | age

-- Cars, person_id is a foreign key to show that this person owns this car
car_id | car_year | car_make | car_model | person_id

Допустим, я хочу заполнить следующее представление таблицы или виджет таблицы смесью этих данных, например так

// Table that the user sees. Notice that not all the information from the tables is shown.
first_name | last_name | car_year | car_make | car_model

Каков наилучший/рекомендуемый способ сделать это? Я вижу следующие два способа, но я считаю, что ни один из них не лучший способ сделать это.

  1. Используйте виджет таблицы, представляющий собой представление таблицы на основе элементов с моделью по умолчанию. Чтобы сделать это, я предполагаю, что мне нужно будет сделать QSqlQuery, чтобы получить данные из моей QSqlDatabase и просто таким образом заполнить виджет таблицы.
  2. Используйте Table View, что потребует от меня создания моей собственной QSqlTableModel для модели данных представления. Согласно документации для QSqlTableModel, это высокоуровневый интерфейс для чтения и записи записей базы данных из одной таблицы. Это означает, что мне понадобятся две QSqlTableModels, по одной для каждой из моих таблиц выше. Однако табличное представление может использовать только одну модель и отображать все данные из этой модели. Я думаю, что единственный способ, которым это сработает, - это объединить таблицы в одну таблицу только с той информацией, которую я хочу, чтобы пользователь видел. Я чувствую, что это было бы очень уродливо, но возможно. В таком случае, должен ли я иметь всего три таблицы — две приведенные выше плюс объединенную для просмотра пользователями?

Я чувствую, что #1 лучше из этих двух, но мне интересно, есть ли еще лучший способ, чем оба из них.


person Programmer_D    schedule 15.05.2017    source источник
comment
Возможный дубликат Как отображать содержимое нескольких QSqlTableModels в одном QTableView?   -  person MrEricSir    schedule 15.05.2017


Ответы (1)


Если person_id является первичным ключом таблицы people, вы можете использовать QtSql.QsqlRelationalTableModel для отображения данных из нескольких таблиц в QtWidgets.QTableView, вот ваш пример:

QSqlRelationalTableModel rm = new QSqlRelationalTableModel(parentObject, database);
rm→setTable(„cars“);
rm→setRelation(4, QSqlRelation(„people“, „person_id“, „first_name, last_name“);
rm→select();
QTableView tv = new QTableView();
tv→setModel(rm);
tv→hideColumn(0);           # hide column car_id
hh = tv->horizontalHeader();
hh→moveSection(4, 0);       # change order of columns
hh→moveSection(5, 1);
person a_manthey_67    schedule 16.05.2017