Здесь: Добавление данных в таблицу QTableWidget. Очистка таблицы — я рассказала, как заполнить таблицу QTableWidget данными из объекта QMap. Можно сказать, через годы и расстояния :), я решила чуть больше развернуть эту тему и показать, как организовать добавление данных запроса в таблицу. Для тех, кому по какой-то причине нужно использовать объект QTableWidget вместо QTableView.
За основу возьмем таблицы из поста об исследовании различных типов запросов с explain analyze. Предположим, необходимо вывести информацию о том, сколько людей проживает в каждом городе (Город | Количество людей)? упорядочив по убыванию значения количества людей в городе:
select a.name, count(b.id)
from cities a
inner join people b on a.id = b.city_id
group by a.name
order by count(b.id) desc
Теперь оформим этот запрос в коде в Qt для объекта QTableWidget под названием editingTable, вместе с тем создадим и дадим имена заголовкам таблицы:
QSqlQuery query;
if (!query.exec("select a.name as Город, count(b.id) as Количество "
"from cities "
"a inner join people b on a.id = b.city_id "
"group by a.name "
"order by count(b.id) desc")) {
qDebug() << "ooops" << query.lastError().text();
return;
}
if (!query.first()) {
QMessageBox::warning(this, tr("Непонятно"),
tr("Запрос не вернул результата"));
return;
}
//заберем информацию о полях запроса
QSqlRecord rec = query.record();
//подарим таблице заголовки по указанным альясам
for(int i = 0; i < rec.count(); ++i) {
ui->editingTable->insertColumn(i);
ui->editingTable->setHorizontalHeaderItem(
0, new QTableWidgetItem(rec.fieldName(i)));
}
//пока есть данные в запросе - берем
do {
ui->editingTable->setRowCount(ui->editingTable->rowCount()+1);
ui->editingTable->setItem(ui->editingTable->rowCount() - 1, 0,
new QTableWidgetItem(query.value(0).toString()));
ui->editingTable->setItem(ui->editingTable->rowCount() - 1, 1,
new QTableWidgetItem(query.value(1).toString()));
} while(query.next());
ui->editingTable->resizeColumnsToContents();
В первой группе подсвеченных строк видно, как можно циклом несложно пробежаться по полям запроса и забрать наименования полей. Во второй группе подсвеченных строк идет ручное перечисление. Иногда быстрее просто перечислить — когда необходимых полей немного. А можно еще считать наименования полей в список строк и работать с ним. Если необходимо часто обращаться к такой информации — будет достаточно удобно:
QSqlQuery query;
if (!query.exec("select a.name as Город, count(b.id) as Количество "
"from cities "
"a inner join people b on a.id = b.city_id "
"group by a.name "
"order by count(b.id) desc")) {
qDebug() << "ooops" << query.lastError().text();
return;
}
if (!query.first()) {
QMessageBox::warning(this, tr("Непонятно"),
tr("Запрос не вернул результата"));
return;
}
//заберем информацию о полях запроса
QSqlRecord rec = query.record();
QStringList fieldNames;
//подарим таблице заголовки по указанным альясам
for(int i = 0; i < rec.count(); ++i) {
ui->editingTable->insertColumn(i);
ui->editingTable->setHorizontalHeaderItem(
0, new QTableWidgetItem(rec.fieldName(i)));
fieldNames << rec.fieldName(i);
}
//пока есть данные в запросе - берем
do {
ui->editingTable->setRowCount(ui->editingTable->rowCount()+1);
for(int i = 0; i < fieldNames.size(); ++i)
ui->editingTable->setItem(ui->editingTable->rowCount() - 1, i,
new QTableWidgetItem(query.value(fieldNames[i]).toString()));
} while(query.next());
ui->editingTable->resizeColumnsToContents();
Или без обращения к наименованиям вообще — а через индексы:
for(int i = 0; i < query.record().count(); ++i)
ui->editingTable->setItem(ui->editingTable->rowCount() - 1, i,
new QTableWidgetItem(query.value(i).toString()));
Таким образом будет удобно реализовать добавление данных запроса в таблицу в том случае, когда необходимо вывести всю информацию в текстовом виде. Как установить какой-либо виджет в ячейку QTableWidget на примере QComboBox, показано в этой записи: QTableWidget: добавить список QComboBox в ячейку.
Понравилось это:
Нравится Загрузка...
Похожие записи
Добавление данных запроса в таблицу QTableWidget: 1 комментарий