删除 Table View() 最后一行下方的灰色带而不拉伸单元格?

Posted

技术标签:

【中文标题】删除 Table View() 最后一行下方的灰色带而不拉伸单元格?【英文标题】:Remove grey band below QTableView() last row without cell streching? 【发布时间】:2020-10-25 10:39:28 【问题描述】:

在相关question 中给出的solution 删除了给定图像中显示的灰色带。如果您按照下面的脚本将QtWidgets.QHeaderView.Stretch 更改为QtWidgets.QHeaderView.Fixed,则此灰色带会回来,并且单元格以垂直或水平方式固定。

希望在不调整单元格高度或宽度的情况下移除灰色带。

注1:原图来自用户xwsz。

代码:

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt


class TableModel(QtCore.QAbstractTableModel):
    def __init__(self, data):
        super(TableModel, self).__init__()
        self._data = data

    def data(self, index, role):
        if role == Qt.DisplayRole:
            return self._data[index.row()][index.column()]

    def rowCount(self, index):
        return len(self._data)

    def columnCount(self, index):
        return len(self._data[0])
    
    def headerData(self, section, orientation, role):
        # section is the index of the column/row.
        if role == Qt.DisplayRole:
            if orientation == Qt.Horizontal:
                column_label = ['A', 'B1', 'B2']
                return column_label[section]

            if orientation == Qt.Vertical:
                row_label = ['Device', 'ID', 'Operation', 'Weigth', 'Row 5', 'No Show']
                return row_label[section]


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.table = QtWidgets.QTableView()

        data = [
          [4, 9, 2],
          [1, 0, 0],
          [3, 5, 0],
          [3, 3, 2],
          [7, 8, 9],
        ]
        
        self.model = TableModel(data)
#        self.table.verticalHeader().setDefaultSectionSize(50) # does not sove it.

#        self.table.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
        self.table.verticalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Fixed)
        
#        self.table.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
        self.table.setModel(self.model)

        self.setCentralWidget(self.table)


app=QtWidgets.QApplication(sys.argv)
window=MainWindow()
window.show()
app.exec_()

注意 2:Martin Fitzpatrick 的原始代码可以在 here 找到,并在此处修改以显示问题。

【问题讨论】:

【参考方案1】:

解决方案是创建一个QHeaderView,其中没有内容的部分被绘制:

class VerticalHeaderView(QtWidgets.QHeaderView):
    def __init__(self, parent=None):
        super().__init__(QtCore.Qt.Vertical, parent)

    def paintEvent(self, event):
        super().paintEvent(event)
        h = self.offset()
        for i in range(self.count()):
            h += self.sectionSize(i)
        if h < self.rect().bottom():
            r = QtCore.QRect(self.rect())
            r.moveTop(h)
            painter = QtGui.QPainter(self.viewport())
            painter.fillRect(r, QtGui.QColor("white"))
header = VerticalHeaderView(self.table)
self.table.setVerticalHeader(header)

【讨论】:

谢谢,这部分起到了作用。当 header = VerticalHeaderView(self.table).. etc. 放在 self.table.verticalHeader().setStyleSheet("border: 1px; border-right: 1px solid black;") 之前,发布的解决方案有效。我对 Horizo​​ntalHeader 做了同样的事情,但是没有显示实线。反过来也可以,但是实线会永远持续下去。所以我猜这应该通过在零列中为单元格的左边框着色来完成?或零列的左边框。

以上是关于删除 Table View() 最后一行下方的灰色带而不拉伸单元格?的主要内容,如果未能解决你的问题,请参考以下文章

vi编辑器的使用

从 UITabBar 中删除 transculent 会在其上方添加灰色框架

对table最后一行显示与隐藏

一行代码实现灰色铅笔画彩色铅笔画和卡通画效果(C++/Python OpenCV源码)

JQUERY方法给TABLE动态增加行

求问QT creator的table view一些问题……