为什么 QTableView 有空白边距,如何删除它们?
Why does QTableView have blank margins and how can I remove them?
下面的 PyQt 程序生成一个 window,其中包含一个 QTableView
,其底部和右侧(但不是顶部和左侧)有一个边距 space - 即使 main-window 被告知根据其内容大小调整自身:
我期待看到:
如果我从原来的位置增加 window 的大小,我会看到:
该区域的用途是什么?可以消除吗?如果是,怎么做?
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_()
如果您不指定 table 的元素应如何调整大小,则空白区域是正常的和预期的。有许多不同的配置可以适应不同的用例,因此您可能需要进行一些试验才能获得您想要的确切行为。
右侧和底部边缘的初始页边距允许滚动条。如果你不想要滚动条,你可以像这样关闭它们:
self.table.setHorizontalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff)
self.table.setVerticalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff)
但是,当 window 调整大小时,空白区域仍然存在 - 但您可以通过设置 section resize mode 来解决这个问题,如下所示:
self.table.horizontalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.Stretch)
self.table.verticalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.Stretch)
这可能会导致 window 出现意外的初始大小,因此建议设置适当的默认值:
self.resize(400, 200)
有关详细信息,请参阅 QTableView and QHeaderView 的文档。
下面的 PyQt 程序生成一个 window,其中包含一个 QTableView
,其底部和右侧(但不是顶部和左侧)有一个边距 space - 即使 main-window 被告知根据其内容大小调整自身:
我期待看到:
如果我从原来的位置增加 window 的大小,我会看到:
该区域的用途是什么?可以消除吗?如果是,怎么做?
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_()
如果您不指定 table 的元素应如何调整大小,则空白区域是正常的和预期的。有许多不同的配置可以适应不同的用例,因此您可能需要进行一些试验才能获得您想要的确切行为。
右侧和底部边缘的初始页边距允许滚动条。如果你不想要滚动条,你可以像这样关闭它们:
self.table.setHorizontalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff)
self.table.setVerticalScrollBarPolicy(
QtCore.Qt.ScrollBarAlwaysOff)
但是,当 window 调整大小时,空白区域仍然存在 - 但您可以通过设置 section resize mode 来解决这个问题,如下所示:
self.table.horizontalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.Stretch)
self.table.verticalHeader().setSectionResizeMode(
QtWidgets.QHeaderView.Stretch)
这可能会导致 window 出现意外的初始大小,因此建议设置适当的默认值:
self.resize(400, 200)
有关详细信息,请参阅 QTableView and QHeaderView 的文档。