一、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()函数控制排序指示器,为表头设置上下文菜单,调整列的大小和样式。