更改QHeaderView空间缓冲区

问题描述 投票:1回答:1

我有一个稍微定制的QTableView,展示了我开发的模型。当我指示TableView resizeColumnToContents时,我最终在列文本的两侧有一个大约20像素的额外缓冲区。对于我的桌子来说,这是一个重大的矫枉过正,如下所示。

用户可以手动调整列的大小以删除该缓冲区,但是当有很多列时,它会很烦人。

如何以编程方式更改此缓冲区/边距大小?我愿意使用delegates,sizeHints,styleSheets,无论需要什么。我只是找不到这个值设置的位置。

编辑:单步执行QHeaderView::sizeHint()和QHeaderView::sectionSizeFromContents()告诉我发生这种情况是因为我启用了排序(qheaderview.cpp的第2588行)。禁用排序删除了水平缓冲区。

如果启用排序,为什么sizehint会将标题高度的缓冲区添加到其宽度?排序指示符出现在标题上方(见下文)。排序指示符与所需的列宽无关。奇怪的。

除了实现我自己的QHeaderView类之外,我无法找到解决方法。有没有更好的办法?

c++ qt qt4 qtableview
1个回答
0
投票

Qt4中的一个错误在Qt5中被修复了。它为使用Vista风格的排序指示器留下了额外的空间。

实现我自己的QHeaderView子类是在qt 4.8中解决这个问题的唯一方法。

QSize MyHeaderView::sectionSizeFromContents(int logicalIndex) const
{
    QSize sz = QHeaderView::sectionSizeFromContents(logicalIndex);

    //Qt 4.8.x workaround to remove horizontal spacing from sort indicator with vista style
    if(isSortIndicatorShown())
    {
        auto style = qApp->style();
        if(orientation() == Qt::Horizontal && style->objectName() == "windowsvista")
        {
            int margin = style->pixelMetric(QStyle::PM_HeaderMargin, 0, this);
            sz.rwidth() -= margin + sz.height();
        }
    }

    return sz;
}

我使用Qt 5.11.1在Windows 7和10上对此进行了测试,不再需要解决方法。我不确定它到底是什么时候修好的。

© www.soinside.com 2019 - 2024. All rights reserved.