您的位置:

使用QHeaderView为QTableView添加自定义表头

一、QHeaderView介绍

QHeaderView 是一个可以与 QAbstractItemView 子类一起使用的标头视图类。它主要用于控制表格、列表、树的表头(Header)的显示与编辑功能。表格中的一个 Header 可以分为多个 Section,每个 Section 都有自己的大小、内容、位置和附加数据的信息。在 QHeaderView 中,一个 Section 被定义为 int 类型的编号 logicalIndex,而 QModelIndex 被定义为 logicalIndexvisualIndex 的两个值。

二、QTableView中设置表头

QTableView 是一个用于显示表格或列表的基本控件。和 QHeaderView 一起组合使用,可以方便地实现表格、列表等视图。

在 QTableView 中,表头是通过 setHorizontalHeader()setVerticalHeader() 方法来设置的。主要是给表格或者列表的每一列或每一行设置一个标题。

// 设置列标题
tableView->setHorizontalHeaderLabels(QStringList() << tr("Name") << tr("Age") << tr("Gender"));
// 设置行标题
tableView->setVerticalHeaderLabels(QStringList() << tr("Row 1") << tr("Row 2") << tr("Row 3"));

三、自定义表头

在 QHeaderView 中,一个 Section 的大小、对齐方式、前景色、背景色、字体、图标等等,都可以进行自定义设置。以下是一些重要属性:

  • setSectionResizeMode(int logicalIndex, QHeaderView::ResizeMode mode):设置 Section 的自动伸缩方式,如 Stretch、Fixed、Interactive 等。
  • setSectionAlignment(int logicalIndex, Qt::Alignment alignment):设置 Section 中的文本或图标的对齐方式。
  • setDefaultSectionSize(int size):设置 Section 的默认尺寸大小。
  • setSectionHidden(int logicalIndex, bool hide):隐藏或显示某个 Section。
  • setSectionSize(int logicalIndex, int size):设置 Section 的大小。
  • setSectionResizeMode(QHeaderView::ResizeMode mode):设置整个 Header 的默认自动伸缩方式。
  • setHighlightSections(bool highlight):设置是否在鼠标滑过 Section 时高亮该 Section。

以下是一个例子,展示如何自定义列的大小、对齐方式、前景色、背景色、字体和图标:

// 列编号从 0 开始
// 1. 设置第 1 列为 Interactive 模式,其余为 Stretch 模式
header->setSectionResizeMode(0, QHeaderView::Interactive);
header->setSectionResizeMode(1, QHeaderView::Stretch);
header->setSectionResizeMode(2, QHeaderView::Stretch);
header->setSectionResizeMode(3, QHeaderView::Stretch);
// 2. 设置第 1 列的宽度为 100,其余根据内容自动计算
header->setSectionSize(0, 100);
// 3. 设置第 2、3 列的文本对齐方式为居中
header->setSectionAlignment(1, Qt::AlignCenter);
header->setSectionAlignment(2, Qt::AlignCenter);
// 4. 设置第 1、2 列的前景色为蓝色,第 3、4 列的前景色为红色
header->setForegroundRole(0, QBrush(QColor(Qt::blue)));
header->setForegroundRole(1, QBrush(QColor(Qt::blue)));
header->setForegroundRole(2, QBrush(QColor(Qt::red)));
header->setForegroundRole(3, QBrush(QColor(Qt::red)));
// 5. 设置第 1、2 列的背景色为浅灰色,第 3、4 列的背景色为深灰色
header->setBackgroundRole(0, QBrush(QColor(Qt::lightGray)));
header->setBackgroundRole(1, QBrush(QColor(Qt::lightGray)));
header->setBackgroundRole(2, QBrush(QColor(Qt::darkGray)));
header->setBackgroundRole(3, QBrush(QColor(Qt::darkGray)));
// 6. 设置第 1 列的字体为加粗
header->setFont(0, QFont("Arial", 10, QFont::Bold));
// 7. 在第 1 列的 Section 中添加图标
QIcon myIcon(":icon.png");
header->setSectionIcon(0, myIcon);

四、完整代码演示

以下是一个完整的代码示例,演示如何使用 QHeaderView 实现自定义表头:

// main.cpp
#include <QApplication>
#include <QStandardItemModel>
#include <QTableView>
#include <QHeaderView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QStandardItemModel *model = new QStandardItemModel(3, 4);
    model->setHeaderData(0, Qt::Horizontal, QObject::tr("Name"));
    model->setHeaderData(1, Qt::Horizontal, QObject::tr("Age"));
    model->setHeaderData(2, Qt::Horizontal, QObject::tr("Gender"));
    model->setHeaderData(0, Qt::Vertical, QObject::tr("Row 1"));
    model->setHeaderData(1, Qt::Vertical, QObject::tr("Row 2"));
    model->setHeaderData(2, Qt::Vertical, QObject::tr("Row 3"));

    QTableView *tableView = new QTableView;
    tableView->setModel(model);

    QHeaderView *header = tableView->horizontalHeader();
    header->setSectionResizeMode(0, QHeaderView::Interactive);
    header->setSectionResizeMode(1, QHeaderView::Stretch);
    header->setSectionResizeMode(2, QHeaderView::Stretch);
    header->setSectionResizeMode(3, QHeaderView::Stretch);
    header->setSectionSize(0, 100);
    header->setSectionAlignment(1, Qt::AlignCenter);
    header->setSectionAlignment(2, Qt::AlignCenter);
    header->setForegroundRole(0, QBrush(QColor(Qt::blue)));
    header->setForegroundRole(1, QBrush(QColor(Qt::blue)));
    header->setForegroundRole(2, QBrush(QColor(Qt::red)));
    header->setForegroundRole(3, QBrush(QColor(Qt::red)));
    header->setBackgroundRole(0, QBrush(QColor(Qt::lightGray)));
    header->setBackgroundRole(1, QBrush(QColor(Qt::lightGray)));
    header->setBackgroundRole(2, QBrush(QColor(Qt::darkGray)));
    header->setBackgroundRole(3, QBrush(QColor(Qt::darkGray)));
    header->setFont(0, QFont("Arial", 10, QFont::Bold));
    QIcon myIcon(":icon.png");
    header->setSectionIcon(0, myIcon);

    tableView->setHorizontalHeader(header);
    tableView->show();

    return a.exec();
}