为啥 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 有空白边距,我该如何删除它们?的主要内容,如果未能解决你的问题,请参考以下文章

CSS如何给图片加上白边效果

用CSS如何给字体加白边

为啥我做的CSS+div完成后,背景图片有白边?

用 pdffactory pro 转PDF时会有白边 如何去掉

如何在 QTableView 中创建冻结的页脚行

为啥这个框架内div会造成接缝处的白边(图)?