问题描述
以下 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_()
解决方法
如果您没有指定表格元素应如何调整大小,则空白区域是正常的和预期的。有许多不同的配置可以适应不同的用例,因此您可能需要进行一些试验才能获得所需的确切行为。
沿右侧和底部边缘的初始边距用于滚动条。如果你不想要滚动条,你可以像这样关闭它们:
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 的文档。