我有一个稍微定制的QTableView,展示了我开发的模型。当我指示TableView resizeColumnToContents时,我最终在列文本的两侧有一个大约20像素的额外缓冲区。对于我的桌子来说,这是一个重大的矫枉过正,如下所示。
用户可以手动调整列的大小以删除该缓冲区,但是当有很多列时,它会很烦人。
如何以编程方式更改此缓冲区/边距大小?我愿意使用delegates,sizeHints,styleSheets,无论需要什么。我只是找不到这个值设置的位置。
编辑:单步执行QHeaderView::sizeHint()和QHeaderView::sectionSizeFromContents()告诉我发生这种情况是因为我启用了排序(qheaderview.cpp的第2588行)。禁用排序删除了水平缓冲区。
如果启用排序,为什么sizehint会将标题高度的缓冲区添加到其宽度?排序指示符出现在标题上方(见下文)。排序指示符与所需的列宽无关。奇怪的。
除了实现我自己的QHeaderView类之外,我无法找到解决方法。有没有更好的办法?
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上对此进行了测试,不再需要解决方法。我不确定它到底是什么时候修好的。