问题:
有时候我们会重载QAbstractTableView+QHeaderView实现自定义Table和Header的效果。
但是有时因为自定义了QHeaderView,就想着在QHeaderView中改变列宽。其实这是不可以的。
我们一般会在QHeaderView中实现void QHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const;
接口,实现自定义列头样式。如果我们想着同样通过重载virtual QSize QHeaderView::sectionSizeFromContents(int logicalIndex) const
实现自定义列宽,那是错误的。这个接口并不能改变列宽,甚至是这个void QHeaderView::resizeSection(int logicalIndex, int size)
也不行。
最后是通过,自定义QHeaderView中只重载paintSection实现样式外,其他的都没有(也就是不要重载sectionSizeFromContents)。然后在QTableView中,调用如下接口,自定义列宽:
- QTableView::horizontalHeader()::setSectionResizeMode(0, QHeaderView::Stretch);
- QTableView::setColumnWidth(2, 80);
参考代码自定义QTableHeaderView代码:
void FFileTableHeaderView::paintSection(QPainter *painter, const QRect &rect, int logicalIndex) const
{
painter->setRenderHint(QPainter::Antialiasing);
// 绘制背景
painter->setBrush(QColor(0x30, 0x31, 0x34));
painter->setPen(QPen(QColor(0x30, 0x31, 0x34), 0));
painter->drawRect(rect);
// 绘制边线
painter->setBrush(QColor(0x3C, 0x3D, 0x40));
painter->setPen(QPen(QColor(0x3C, 0x3D, 0x40), 0));
QRect line(rect.x(), rect.y(), rect.width(), 1);
painter->drawRect(line);
line = QRect(rect.x(), rect.height() - 1, rect.width(), 1);
painter->drawRect(line);
// 绘制文字
QRect geometry(rect.left() + 15, 6, 25, 18);
QString text = this->fileTableModel ? this->fileTableModel->headerData(logicalIndex, Qt::Horizontal).toString() : "";
geometry.setWidth(FPublicFunction::boundingRectOfTextAndFont(text, FPublicFunction::defaultNormalFont()).width());
painter->setPen(QPen(Qt::white, 1));
painter->setFont(FPublicFunction::defaultLargeFont());
painter->drawText(geometry, text);
// 绘制排序图标
if (logicalIndex == this->sortIndicatorSection())
{
Qt::SortOrder order = this->sortIndicatorOrder();
QString imageName = "ic_ascend";
if (order == Qt::DescendingOrder) imageName = "ic_descend";
geometry = QRect(geometry.right() + 4, 10, 10, 10);
painter->drawImage(geometry, QImage(imageName));
}
}
参考设置代码:
QTableView *contentTableView = ui->contentTableView;
FFileTableHeaderView *tableHeaderView = new FFileTableHeaderView(contentTableView); // 自定义QHeaderView
contentTableView->setHorizontalHeader(tableHeaderView);
contentTableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);
contentTableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
contentTableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Fixed);
contentTableView->horizontalHeader()->setSectionResizeMode(3, QHeaderView::Fixed);
contentTableView->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Fixed);
contentTableView->horizontalHeader()->setSectionResizeMode(5, QHeaderView::Fixed);
contentTableView->horizontalHeader()->setSectionResizeMode(6, QHeaderView::Fixed);
contentTableView->horizontalHeader()->setMinimumSectionSize(150);
contentTableView->setColumnWidth(2, 80);
contentTableView->setColumnWidth(3, 80);
contentTableView->setColumnWidth(4, 80);
contentTableView->setColumnWidth(5, 80);
contentTableView->setColumnWidth(6, 80);
contentTableView->setColumnWidth(0, 150);
contentTableView->setColumnWidth(1, 250);