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

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

Здесь: Добавление данных в таблицу QTableWidget. Очистка таблицы — я рассказала, как заполнить таблицу QTableWidget данными из объекта QMap. Можно сказать, через годы и расстояния :), я решила чуть больше развернуть эту тему и показать, как организовать добавление данных запроса в таблицу. Для тех, кому по какой-то причине нужно использовать объект QTableWidget вместо QTableView.

За основу возьмем таблицы из поста об исследовании различных типов запросов с explain analyze. Предположим, необходимо вывести информацию о том, сколько людей проживает в каждом городе (Город | Количество людей)? упорядочив по убыванию значения количества людей в городе:

[pastacode lang=»sql» manual=»select%20a.name%2C%20count(b.id)%20%0Afrom%20cities%20a%20%0Ainner%20join%20people%20b%20on%20a.id%20%3D%20b.city_id%0Agroup%20by%20a.name%0Aorder%20by%20count(b.id)%20desc» message=»» highlight=»» provider=»manual»/]

Теперь оформим этот запрос в коде в Qt для объекта QTableWidget под названием editingTable, вместе с тем создадим и дадим имена заголовкам таблицы:

[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aif%20(!query.exec(%22select%20a.name%20as%20%D0%93%D0%BE%D1%80%D0%BE%D0%B4%2C%20count(b.id)%20as%20%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%22%0A%09%09%09%22from%20cities%20%22%0A%09%09%09%22a%20inner%20join%20people%20b%20on%20a.id%20%3D%20b.city_id%20%22%0A%09%09%09%22group%20by%20a.name%20%22%0A%09%09%09%22order%20by%20count(b.id)%20desc%22))%20%7B%0A%09qDebug()%20%3C%3C%20%22ooops%22%20%3C%3C%20query.lastError().text()%3B%0A%09return%3B%0A%7D%0Aif%20(!query.first())%20%7B%0A%09QMessageBox%3A%3Awarning(this%2C%20tr(%22%D0%9D%D0%B5%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%BD%D0%BE%22)%2C%0A%09%09tr(%22%D0%97%D0%B0%D0%BF%D1%80%D0%BE%D1%81%20%D0%BD%D0%B5%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D0%BB%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0%22))%3B%0A%09return%3B%0A%7D%0A%2F%2F%D0%B7%D0%B0%D0%B1%D0%B5%D1%80%D0%B5%D0%BC%20%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8E%20%D0%BE%20%D0%BF%D0%BE%D0%BB%D1%8F%D1%85%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%0AQSqlRecord%20rec%20%3D%20query.record()%3B%0A%2F%2F%D0%BF%D0%BE%D0%B4%D0%B0%D1%80%D0%B8%D0%BC%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B5%20%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%BF%D0%BE%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%20%D0%B0%D0%BB%D1%8C%D1%8F%D1%81%D0%B0%D0%BC%0Afor(int%20i%20%3D%200%3B%20i%20%3C%20rec.count()%3B%20%2B%2Bi)%20%7B%0A%09ui-%3EeditingTable-%3EinsertColumn(i)%3B%0A%09ui-%3EeditingTable-%3EsetHorizontalHeaderItem(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%2C%20new%20QTableWidgetItem(rec.fieldName(i)))%3B%0A%7D%0A%09%2F%2F%D0%BF%D0%BE%D0%BA%D0%B0%20%D0%B5%D1%81%D1%82%D1%8C%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B2%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B5%20-%20%D0%B1%D0%B5%D1%80%D0%B5%D0%BC%0Ado%20%7B%0A%09ui-%3EeditingTable-%3EsetRowCount(ui-%3EeditingTable-%3ErowCount()%2B1)%3B%0A%20%20%20%20ui-%3EeditingTable-%3EsetItem(ui-%3EeditingTable-%3ErowCount()%20-%201%2C%200%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20QTableWidgetItem(query.value(0).toString()))%3B%0A%20%20%20%20ui-%3EeditingTable-%3EsetItem(ui-%3EeditingTable-%3ErowCount()%20-%201%2C%201%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20QTableWidgetItem(query.value(1).toString()))%3B%0A%7D%20while(query.next())%3B%0Aui-%3EeditingTable-%3EresizeColumnsToContents()%3B%0A» message=»» highlight=»18-21,26-29″ provider=»manual»/]

В первой группе подсвеченных строк видно, как можно циклом несложно пробежаться по полям запроса и забрать наименования полей. Во второй группе подсвеченных строк идет ручное перечисление. Иногда быстрее просто перечислить — когда необходимых полей немного. А можно еще считать наименования полей в список строк и работать с ним. Если необходимо часто обращаться к такой информации — будет достаточно удобно:

[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aif%20(!query.exec(%22select%20a.name%20as%20%D0%93%D0%BE%D1%80%D0%BE%D0%B4%2C%20count(b.id)%20as%20%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%22%0A%09%09%09%22from%20cities%20%22%0A%09%09%09%22a%20inner%20join%20people%20b%20on%20a.id%20%3D%20b.city_id%20%22%0A%09%09%09%22group%20by%20a.name%20%22%0A%09%09%09%22order%20by%20count(b.id)%20desc%22))%20%7B%0A%09qDebug()%20%3C%3C%20%22ooops%22%20%3C%3C%20query.lastError().text()%3B%0A%09return%3B%0A%7D%0Aif%20(!query.first())%20%7B%0A%09QMessageBox%3A%3Awarning(this%2C%20tr(%22%D0%9D%D0%B5%D0%BF%D0%BE%D0%BD%D1%8F%D1%82%D0%BD%D0%BE%22)%2C%0A%09%09tr(%22%D0%97%D0%B0%D0%BF%D1%80%D0%BE%D1%81%20%D0%BD%D0%B5%20%D0%B2%D0%B5%D1%80%D0%BD%D1%83%D0%BB%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D0%B0%22))%3B%0A%09return%3B%0A%7D%0A%2F%2F%D0%B7%D0%B0%D0%B1%D0%B5%D1%80%D0%B5%D0%BC%20%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%86%D0%B8%D1%8E%20%D0%BE%20%D0%BF%D0%BE%D0%BB%D1%8F%D1%85%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%0AQSqlRecord%20rec%20%3D%20query.record()%3B%0AQStringList%20fieldNames%3B%0A%2F%2F%D0%BF%D0%BE%D0%B4%D0%B0%D1%80%D0%B8%D0%BC%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D0%B5%20%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%B8%20%D0%BF%D0%BE%20%D1%83%D0%BA%D0%B0%D0%B7%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%20%D0%B0%D0%BB%D1%8C%D1%8F%D1%81%D0%B0%D0%BC%0Afor(int%20i%20%3D%200%3B%20i%20%3C%20rec.count()%3B%20%2B%2Bi)%20%7B%0A%09ui-%3EeditingTable-%3EinsertColumn(i)%3B%0A%09ui-%3EeditingTable-%3EsetHorizontalHeaderItem(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200%2C%20new%20QTableWidgetItem(rec.fieldName(i)))%3B%0A%09fieldNames%20%3C%3C%20rec.fieldName(i)%3B%0A%7D%0A%09%2F%2F%D0%BF%D0%BE%D0%BA%D0%B0%20%D0%B5%D1%81%D1%82%D1%8C%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B5%20%D0%B2%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B5%20-%20%D0%B1%D0%B5%D1%80%D0%B5%D0%BC%0Ado%20%7B%0A%09ui-%3EeditingTable-%3EsetRowCount(ui-%3EeditingTable-%3ErowCount()%2B1)%3B%0A%09for(int%20i%20%3D%200%3B%20i%20%3C%20fieldNames.size()%3B%20%2B%2Bi)%0A%09%09ui-%3EeditingTable-%3EsetItem(ui-%3EeditingTable-%3ErowCount()%20-%201%2C%20i%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20QTableWidgetItem(query.value(fieldNames%5Bi%5D).toString()))%3B%0A%7D%20while(query.next())%3B%0Aui-%3EeditingTable-%3EresizeColumnsToContents()%3B%0A» message=»» highlight=»» provider=»manual»/]

Или без обращения к наименованиям вообще — а через индексы:

[pastacode lang=»cpp» manual=»for(int%20i%20%3D%200%3B%20i%20%3C%20query.record().count()%3B%20%2B%2Bi)%0A%09%09ui-%3EeditingTable-%3EsetItem(ui-%3EeditingTable-%3ErowCount()%20-%201%2C%20i%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20new%20QTableWidgetItem(query.value(i).toString()))%3B» message=»» highlight=»» provider=»manual»/]

Таким образом будет удобно реализовать добавление данных запроса в таблицу в том случае, когда необходимо вывести всю информацию в текстовом виде. Как установить какой-либо виджет в ячейку QTableWidget на примере QComboBox, показано в этой записи: QTableWidget: добавить список QComboBox в ячейку.

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

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

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