删除 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;") 之前,发布的解决方案有效。我对 HorizontalHeader 做了同样的事情,但是没有显示实线。反过来也可以,但是实线会永远持续下去。所以我猜这应该通过在零列中为单元格的左边框着色来完成?或零列的左边框。以上是关于删除 Table View() 最后一行下方的灰色带而不拉伸单元格?的主要内容,如果未能解决你的问题,请参考以下文章
从 UITabBar 中删除 transculent 会在其上方添加灰色框架