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