【问题标题】:Add border under column headers in QTableWidget在 QTableWidget 的列标题下添加边框
【发布时间】:2016-11-28 00:31:12
【问题描述】:

我有一个表格小部件,对话框中有两个列标题,如下所示:

名为“索引”和“标签”的列标题之间存在分隔,但这些标题与其下方的行之间没有分隔边界。这个怎么加?

假设表被实例化为:

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)

我最终得到的东西看起来像这样:

这样,标题周围就会出现边框。这可以单独为每个标题项完成,但有几个问题:

  1. 边框超出了下方单元格的宽度
  2. 我仍然需要将框架的颜色与现有的线条相匹配,这样才能看起来不错。
  3. 看来,分隔“索引”和“标签”的垂直线相对于分隔下方单元格的线发生了偏移(除非我的眼睛在欺骗我)。

有没有更“内置”的方法来做到这一点?

【问题讨论】:

  • QTableWidget::horizontalHeader() 返回一个指向关联的QHeaderItem 的指针,该指针(向下几级)继承QFrame。设置框架样式/形状/宽度有什么影响吗?
  • 您的建议在整个标题周围创建了一个边框,并且可以单独用于每个标题项,但存在一些问题。见编辑

标签: python qt pyqt border qtablewidget


【解决方案1】:

我遇到了同样的问题。首先要注意的是,这只发生在 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 部分是添加左上角下方缺失边框所必需的。如果垂直标题不可见,则缺少的行也是不可见的。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    试试这个:

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

    【讨论】:

      【解决方案3】:

      对您的代码稍作调整对我有用:

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

      【讨论】:

      • 复制“我什么都不知道”的答案
      • 这个标志不正确,答案不同,请对比代码中的第一个字。我的代码有效,而“我什么都不知道”的无效。
      猜你喜欢
      • 1970-01-01
      • 2019-01-22
      • 2015-12-17
      • 1970-01-01
      • 2019-03-30
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 2017-07-16
      相关资源
      最近更新 更多