Qt, Базы данных

Добавление данных запроса в таблицу QTableWidget

Здесь: Добавление данных в таблицу 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 комментарий

Оставьте своё мнение...

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.