Класс 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(); }