Класс QTableView представляет реализацию класса QAbstractItemView, которая предназначена для отображения данных в виде таблицы.
Определим простейшую таблицу:
#include <QApplication>
#include <QTableView>
#include <QStandardItemModel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget* widget = new QWidget;
widget->setWindowTitle("METANIT.COM");
widget->setMinimumHeight(150);
widget->setMinimumWidth(250);
// определяем данные для модели
QStandardItemModel* model= new QStandardItemModel(3, 2); // 3 строки, 2 столбца
model->setItem(0, 0, new QStandardItem("Tom"));
model->setItem(0, 1, new QStandardItem(39));
model->setItem(1, 0, new QStandardItem("Bob"));
model->setItem(1, 1, new QStandardItem(43));
model->setItem(2, 0, new QStandardItem("Sam"));
model->setItem(2, 1, new QStandardItem(28));
// установка заголовков таблицы
model->setHeaderData(0, Qt::Horizontal, "Name");
model->setHeaderData(1, Qt::Horizontal, "Age");
// определяем представление
QTableView *view = new QTableView(widget);
// устанавливаем модель для представления
view->setModel(model);
widget->show();
return a.exec();
}
Здесь в качестве модели данных для QTableView применяется модель QStandardItemModel, которая представляет таблицу из трех строк и двух столбцов. Условно первый столбец представляет имя пользователя, а второй столбец - возраст. В итоге при установке этой модели для QTableView мы получим следующее приложение:
Класс QTableView предоставляет ряд методов для управления внешним видом. Отмечу некоторые:
setColumnHidden(int column, bool hide): делает видимым или невидимым столбец с индексом column
setColumnWidth(int column, int width): устанавливает ширину столбца с индексом column
setHorizontalHeader(QHeaderView *header): устанавливает горизонтальный заголовок
setRowHeight(int row, int height): устанавливает высоту строки с индексом row
setRowHidden(int row, bool hide): делает видимой или невидимой строку с индексом row
setSortingEnabled(bool enable): включает или отключает поддержку сортировки
setSpan(int row, int column, int rowSpanCount, int columnSpanCount): растягивает ячейку в строке row и столбце column на rowSpanCount строк и columnSpanCount столбцов
setVerticalHeader(QHeaderView *header): устанавливает вертикальный заголовок
setWordWrap(bool on): устанавливает перенос слов
По умолчанию мы можем нажать на любую ячейку и отредактировать ее содержимое. Однако нередко такое поведение нежелательно. Для его отключения можно использовать метод
setEditTriggers(), в который передается значение QAbstractItemView::NoEditTriggers:
QTableView *view = new QTableView(widget); // отключаем редатирование view->setEditTriggers(QAbstractItemView::NoEditTriggers);
По умолчанию QTableView берет определение заголовков из модели. Например, в коде выше для установки заголовков для объекта модели были прописано:
model->setHeaderData(0, Qt::Horizontal, "Name"); model->setHeaderData(1, Qt::Horizontal, "Age");
Первый параметр представляет индекс заголовка. Второй параметр указывает, какой заголовок - если он равен Qt::Horizontal, то устанавливается горизонтальный заголовок или заголовок столбцов. И соответственно
первый параметр указывает на индекс столбца. При значениии Qt::Vertical устанавливается вертикальный заголовок - заголовки строк. Третий параметр представляет содержимое заголовка.
Класс QTableView позволяет настроить стиль заголовка. Прежде всего вертикальный заголовок (заголовки строк) можно получить с помощью функции verticalHeader(), а горизонтальный заголовок (заголовки столбцов) - с помощью функции horizontalHeader(). Эти функции возвращают значение типа QHeaderView, который позволяет настроить отображение заголовка.
Если нас не устраивает стиль текущих заголовков, то их можно переустановить с помощью методов setHorizontalHeader() и setVerticalHeader(). Допустим, нам не нужны заголовки строк,
и мы их можем отключить:
#include <QApplication>
#include <QTableView>
#include <QHeaderView>
#include <QStandardItemModel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget* widget = new QWidget;
widget->setWindowTitle("METANIT.COM");
widget->setMinimumHeight(150);
widget->setMinimumWidth(250);
// определяем данные для модели
QStandardItemModel* model= new QStandardItemModel(3, 2);
model->setItem(0, 0, new QStandardItem("Tom"));
model->setItem(0, 1, new QStandardItem(39));
model->setItem(1, 0, new QStandardItem("Bob"));
model->setItem(1, 1, new QStandardItem(43));
model->setItem(2, 0, new QStandardItem("Sam"));
model->setItem(2, 1, new QStandardItem(28));
// установка заголовков таблицы
model->setHeaderData(0, Qt::Horizontal, "Name");
model->setHeaderData(1, Qt::Horizontal, "Age");
// определяем представление
QTableView *view = new QTableView(widget);
view->setModel(model);
// получаем определение заголовка строк
QHeaderView* headerView = view->verticalHeader();
// делаем его невидимым
headerView->setVisible(false);
// переустанавливаем заголовок
view->setVerticalHeader(headerView);
widget->show();
return a.exec();
}
Кроме того, класс QTableView предоставляет ряд функций-слотов, которые позволяют управлять содержимым таблицы:
hideColumn(int column): скрывает столбец с индексом column
hideRow(int row): скрывает строку с индексом row
resizeColumnToContents(int column): адаптирует размер столбца к его содержимому
resizeColumnsToContents(): адаптирует размер всех столбцов к содержимому
resizeRowToContents(int row): адаптирует размер строки к ее содержимому
resizeRowsToContents(): адаптирует размер всех строк к их содержимому
selectColumn(int column): выделяет столбец с индексом column
selectRow(int row): выделяет строку с индексом row
setShowGrid(bool show): включает отображение линий, которые разделяют строки и столбцы
showColumn(int column): делает видимым столбец с индексом column
showRow(int row): делает видимой строку с индексом row
sortByColumn(int column, Qt::SortOrder order): сортирует данные по столбцу с индексом column. Направление сортировки задается с помощью перечисления
Qt::SortOrder и может принимать следующие значения:
Qt::AscendingOrder: сортировка по возрастанию
Qt::DescendingOrder: сортировка по убыванию
Например, отсортируем таблицу по столбцу "Age" и выделим этот столбец:
#include <QApplication>
#include <QTableView>
#include <QHeaderView>
#include <QStandardItemModel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget* widget = new QWidget;
widget->setWindowTitle("METANIT.COM");
widget->setMinimumHeight(150);
widget->setMinimumWidth(250);
QStandardItemModel* model= new QStandardItemModel(3, 2);
model->setItem(0, 0, new QStandardItem("Tom"));
model->setItem(0, 1, new QStandardItem(39));
model->setItem(1, 0, new QStandardItem("Bob"));
model->setItem(1, 1, new QStandardItem(43));
model->setItem(2, 0, new QStandardItem("Sam"));
model->setItem(2, 1, new QStandardItem(28));
model->setHeaderData(0, Qt::Horizontal, "Name");
model->setHeaderData(1, Qt::Horizontal, "Age");
QTableView *view = new QTableView(widget);
view->setModel(model);
view->selectColumn(1);
view->sortByColumn(1, Qt::AscendingOrder);
widget->show();
return a.exec();
}