[Qt]QAbstractTableView+QHeaderView自定义设置列宽的坑

问题:

有时候我们会重载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);

效果

在这里插入图片描述

参考:

QHeaderView 设置列宽

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值