为啥 QTableView 有空白边距,我该如何删除它们?
Posted
技术标签:
【中文标题】为啥 QTableView 有空白边距,我该如何删除它们?【英文标题】:Why does QTableView have blank margins and how can I remove them?为什么 QTableView 有空白边距,我该如何删除它们? 【发布时间】:2021-02-06 16:08:20 【问题描述】:以下 PyQt 程序生成一个包含 QTableView
的窗口,其底部和右侧(但不是顶部和左侧)有一个边距空间 - 即使主窗口被告知要调整其内容大小:
我期待看到:
如果我从原始位置增加窗口的大小,我会看到:
该区域的目的是什么?可以消除吗?如果有,怎么做?
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QVBoxLayout, QWidget, QApplication, QMainWindow, QTableView
class TableModel(QtCore.QAbstractTableModel):
def __init__(self):
super().__init__()
def data(self, index, role=None):
if role == Qt.DisplayRole:
return 42
def rowCount(self, index):
return 3
def columnCount(self, index):
return 4
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.table = QTableView()
self.model = TableModel()
self.table.setModel(self.model)
self.table.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContents)
self.setCentralWidget(self.table)
app = QApplication(sys.argv)
w = MainWindow()
w.show()
app.exec_()
【问题讨论】:
会不会是因为没有更多的行而这是默认的列宽?如果调整窗口大小会发生什么? 谢谢,但我不确定我是否理解您的评论。我已经用我期望看到的(没有边距)更新了这个问题,以及你的问题的答案显示了如果我增加窗口大小我会看到什么:边距增加。 【参考方案1】:如果您未指定应如何调整表格元素的大小,则空白区域是正常的并且是预期的。有许多不同的配置可以适应不同的用例,因此您可能需要进行一些试验才能获得所需的确切行为。
右侧和底部边缘的初始边距用于允许滚动条。如果你不想要滚动条,你可以像这样关闭它们:
self.table.setHorizontalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff)
self.table.setVerticalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff)
但是,当窗口调整大小时,空白区域仍然存在 - 但您可以通过设置 section resize mode 来处理它,如下所示:
self.table.horizontalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.Stretch)
self.table.verticalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.Stretch)
这可能会导致窗口的初始大小出现意外,因此建议设置适当的默认值:
self.resize(400, 200)
有关更多详细信息,请参阅 QTableView 和 QHeaderView 的文档。
【讨论】:
完美,谢谢。奇怪的是,即使滚动条实际上并不存在,QTableView 也会为滚动条留出空间。 @user118967 首次创建小部件时可能存在滚动条。在某些平台上,无法保证在显示窗口之前获得完全准确的几何图形,因为有些事情是异步发生的。以上是关于为啥 QTableView 有空白边距,我该如何删除它们?的主要内容,如果未能解决你的问题,请参考以下文章