您的位置:

深入探究QHeaderView

一、QHeaderView介绍

QHeaderView是Qt框架中的一个用于表头的控件,可以用于多种场景的表格显示,例如列标题、行标题等。QHeaderView可以在任何继承自QAbstractItemView的类中使用。主要作用是重写paintSection()函数,绘制表头。

二、QHeaderView的使用

在Qt中,以QHeaderView为表头显示的ListView和TableView控件被广泛使用。可以通过setHorizontalHeader()和setVerticalHeader()函数来将一个QHeaderView控件设置为水平和垂直表头。

QHeaderView *hHeader = new QHeaderView(Qt::Horizontal, tableView);
tableView->setHorizontalHeader(hHeader);

创建一个水平表头,将其设置到TableView上。同样,可以创建一个垂直表头:

QHeaderView *vHeader = new QHeaderView(Qt::Vertical, tableView);
tableView->setVerticalHeader(vHeader);

三、QHeaderView的设置

1. 设置大小

QHeaderView可以通过resizeSections()函数调整列的宽度和行的高度。如要让所有列自适应宽度:

hHeader->setSectionResizeMode(QHeaderView::Stretch);

而如果想设置某一列的最小宽度:

hHeader->setSectionResizeMode(0, QHeaderView::ResizeToContents);

代码中的第二个参数(QHeaderView::ResizeToContents)表示根据列中最宽的文本自适应宽度。

2. 设置样式

通过StyleSheet属性可以为QHeaderView设置样式,如下为设置垂直表头的背景颜色:

vHeader->setStyleSheet("QHeaderView::section {background-color: gray;}");

3. 设置排序指示器

当表头上的一列被用于排序时,可以显示一个排序指示器。该指示器可以在setSortIndicator()函数的第一个参数(列号)上设置,第二个参数(Qt::SortOrder)指定排序方式——升序还是降序。

hHeader->setSortIndicatorShown(true);
hHeader->setSortIndicator(0, Qt::AscendingOrder);

4. 设置上下文菜单

可以通过setContextMenuPolicy()函数为QHeaderView设置上下文菜单:

hHeader->setContextMenuPolicy(Qt::CustomContextMenu);
connect(hHeader, SIGNAL(customContextMenuRequested(QPoint)),
        this, SLOT(slotHeaderContextMenuRequested(QPoint)));

调用该函数后,指定上下文菜单为Qt::CustomContextMenu,然后通过connect()函数指定自定义的上下文响应函数。

5. 重写paintSection()函数

可以重写QHeaderView的paintSection()函数来控制绘制表头的外观。以下是列标题中的文本旋转45度的例子:

void CustomHeader::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
    painter->save();
    painter->translate(rect.bottomLeft());
    painter->rotate(-45);
    QRect newRect(0, 0, rect.height(), rect.width());
    int dx = (rect.width() - rect.height()) / 2;
    int dy = (rect.height() - rect.width()) / 2;
    newRect.translate(dx, dy);
    painter->drawText(newRect, Qt::AlignRight | Qt::AlignVCenter, m_model->headerData(logicalIndex, Qt::Horizontal, Qt::DisplayRole).toString());
    painter->restore();
}

四、结语

QHeaderView是Qt中一个非常重要的控件,它在Qt的表格控件中的作用不可忽视。我们可以通过使用QHeaderView来自定义表格控件的样式,并通过重写paintSection()函数,控制表头的外观。同时,可以通过setSortIndicator()函数控制排序指示器,为表头设置上下文菜单,调整列的大小和样式。