QTableView. Табличные представления

Последнее обновление: 12.01.2024

Класс 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 и создание таблиц в Qt

Класс 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

Управление содержимым таблицы

Кроме того, класс 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();
}
выделение и сортирока столбцов в QTableView
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850