为什么 QTableView 有空白边距,我该如何删除它们?

问题描述

以下 PyQt 程序生成一个包含 QTableView 的窗口,其底部和右侧(但不是顶部和左侧)有一个边距空间 - 即使主窗口被告知要根据其内容大小调整自身:

![Result of program showing empty margin

期待看到:

Window without margin

如果我从原来的位置增加窗口的大小,我看到:

Increased window increases empty margin

那个区域的目的是什么?可以消除吗?如果是这样,如何?

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_()

解决方法

如果您没有指定表格元素应如何调整大小,则空白区域是正常的和预期的。有许多不同的配置可以适应不同的用例,因此您可能需要进行一些试验才能获得所需的确切行为。

沿右侧和底部边缘的初始边距用于滚动条。如果你不想要滚动条,你可以像这样关闭它们:

    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)

有关详细信息,请参阅 QTableViewQHeaderView 的文档。