Как закинуть в модель результат запроса?

272
11 июня 2017, 17:32

Имеется такой код:

QSqlQuery qu(*pDB); // pDB - база данных
qu.exec("SELECT `CitiesAndCommunities`.`CityOrCommName`, `BuildingTypes`.`TypeName`, `TableBuildings`.`CountGov`, `TableBuildings`.`CountComm`, `TableBuildings`.`CountPrivate`"
        "FROM `CitiesAndCommunities`, `TableBuildings`, `BuildingTypes` "
        "WHERE `TableBuildings`.`CityOrCommID` = `CitiesAndCommunities`.`CityID` and `TableBuildings`.`BuildTypeID` = `BuildingTypes`.`TypeID`");

Есть некий метод.

void DBFacade::setMainTable(QTableView *tbl)
{
    model   = new QSqlTableModel(this, *pDB);
    model->select();
    tbl->setModel(model);
}

Если я сразу укажу, какую таблицу показывать...

model->setTable("BuildingTypes"); // Есть такая табличка с данными
model->select();

То выведет содержимое таблицы. Это мне пока не нужно.

Мне нужно указать результирующую таблицу с первого приведенного кода. Это возможно? Просто выводит, обычно, таблички с индексами, внешними ключами. А хотелось бы выводить сразу с данными, привязанными к ним. Подходит для таких целей QSqlTableModel?

// Извините, писал в спешке, потому и, может, что-то недорассказал. Если что, я скину, необходимые данные, если это поможет.

Answer 1

Поскольку QSqlTableModel унаследована от QSqlQueryModel, а последняя, в свою очередь, имеет метод QSqlQueryModel::setQuery(), то выполнение произвольного запроса и последующее наполнение модели-таблицы данными кажется вполне реальным. Единственное, в QSqlTableModel данный метод переопределён и объявлен как protected с пометкой в справке, общий смысл которой сводится к тому, что использовать его не то чтобы не рекомендуется, но и не приветствуется. Иными словами, QSqlTableModel предназначена для работы непосредственно с таблицами, но никак не с произвольными выборками.

В рассматриваемой ситуации я бы порекомендовал использовать т.н. представления (view), которые в некотором смысле позволяют эмулировать таблицу из произвольного запроса. В этом случае можно будет использовать QSqlTableModel в штатном режиме. Впрочем, есть и ограничения, но они уже будут исходить от самой СУБД.

READ ALSO
Создать dql запрос к базе

Создать dql запрос к базе

Как можно создать dql запрос к базе в SonataAdminУ меня есть mySQL запрос, его нужно перевести в dql, или как-то заюзать его в таком формате, но я не знаю...

181
Построить точечный график

Построить точечный график

Какой самый простой способ построить точечный график при помощи Java?

288
Создать элемент листа с картинкой и именем

Создать элемент листа с картинкой и именем

Есть окно приложение которое содержит листНужно, чтобы каждый элемент листа отображался как песня в плеере

279
EOFException в Клиент-Сервере зависает 2-й клиент Java

EOFException в Клиент-Сервере зависает 2-й клиент Java

Здравствуйте! Пишу общий чатПри каждом подключении Сервер создает новый поток, там проинициализированы:

377