在QTableWidget中为列标题添加底部边框

6

我有一个表格小部件,在对话框中有两个列标题,看起来像这样:

enter image description here

表格中的列标题名称为“Index”和“Label”之间存在分隔,但是这些标题与它们下面的行之间没有分隔边框。如何添加分隔边框?

假设表格已实例化:

table = QTableWidget(6, 2, self)

我知道通过headerItem = table.horizontalHeaderItem(0)可以获取第一个水平表头作为QTableWidgetItem,然后修改一些属性并将其设置回去,但我不确定要设置哪些属性或是否有更直接的方法。

编辑:

如果我提取标题并通过其底层框架设置样式、阴影和线宽属性:

header = table.horizontalHeader()
header.setFrameStyle(QFrame.Box | QFrame.Plain)
header.setLineWidth(1)
table.setHorizontalHeader(header)

我最终得到了这样的东西:

enter image description here

这样可以在标题周围显示边框。虽然每个标题项都可以单独完成,但有几个问题:

  1. 边框延伸到下面单元格的宽度之外
  2. 我仍然需要将框架的颜色与现有线条相匹配,以使其看起来有点像样。
  3. 似乎分隔“索引”和“标签”的垂直线与下面单元格的线条不一致(除非我的眼花了)。

是否有更“内置”的方法可以做到这一点?


QTableWidget::horizontalHeader() 返回一个指向相关 QHeaderItem 的指针,该对象(在几个级别下)继承自 QFrame。设置框架样式/形状/宽度是否会产生任何影响? - G.M.
你所建议的会在整个标题周围创建一个边框,并且可以用于每个标题项,但存在一些问题。请参见编辑。 - pbreach
3个回答

10

我有同样的问题。首先需要注意的是这只会在Windows 10上发生。在其他操作系统上,没有需要修复的地方,它就可以正常工作。然而,在Windows 10上,绘图基元没有绘制底部边框(这是默认的Windows 10表头样式 - 如在Windows文件资源管理器中所示)。这很不幸,但是可以通过以下样式表解决:

if(QSysInfo::windowsVersion()==QSysInfo::WV_WINDOWS10){
    setStyleSheet(
        "QHeaderView::section{"
            "border-top:0px solid #D8D8D8;"
            "border-left:0px solid #D8D8D8;"
            "border-right:1px solid #D8D8D8;"
            "border-bottom: 1px solid #D8D8D8;"
            "background-color:white;"
            "padding:4px;"
        "}"
        "QTableCornerButton::section{"
            "border-top:0px solid #D8D8D8;"
            "border-left:0px solid #D8D8D8;"
            "border-right:1px solid #D8D8D8;"
            "border-bottom: 1px solid #D8D8D8;"
            "background-color:white;"
        "}");}

很抱歉打扰你用 C++ 代码,但它应该很容易转换成有效的 PyQt 代码。
注意1:背景颜色和填充是不幸的,但它们是必要的,以使我们的自定义渲染看起来像默认渲染。
注意2:边框的颜色是我的系统上网格的颜色。我没有使用默认标题的颜色。
注意3:QTableCornerButton::section 部分是必需的,以添加缺失的下边框到左上角。如果垂直标题不可见,则缺少的线也是不可见的。
希望这有所帮助。

嗨,PyQt6中的等效代码为:if QSysInfo.productType() == "windows" and QSysInfo.productVersion() == "10" - AwaX

3

试试这个:

header.setStyleSheet( "QHeaderView::section { border-bottom: 1px solid gray; }" );

我先尝试了这个,但不幸的是在Windows 10上不够用。 - AwaX
奇怪,对我来说在Windows 10上运行正常。你的结果是什么? - i know nothing
结果是我在标题下面没有边框。在你的代码中,标题是table.horizontalHeader()对吗? - AwaX
是的。你有其他可能会干扰我的代码的样式表吗? - i know nothing

-2

对你的代码进行了微调,这对我很有帮助:

 horizontalHeader().setStyleSheet( "QHeaderView::section { border-bottom: 1px solid gray; }" )

“我什么也不知道”的回答的副本 - mike rodent
这个标志是错误的,答案不同,请比较代码中的第一个单词。我的代码可以工作,而“我什么也不知道”的代码不能。 - Coco Cat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接