如何在 PyQt5 的 QTableview 中将列压缩到最小?
How to Squeeze the Column to minimum in QTableview in PyQt5?
如果我Table像下面提到的那样,
我想按照下面的步骤将所有列压缩到最小滚动条大小或没有滚动条,
在 QTable 中的 PyQt5 中查看如何将任何内容对齐到单元格的中心并希望滚动条最小化,如果可能的话没有滚动条也很好。
如下图文本未对齐,我希望按照图像 1 挤压所有列,并在 Python.
中将文本对齐到 PyQt5 的中心
诀窍是使用水平 header 的 Stretch
调整大小模式,确保所有列适合视图的可用大小。唯一的问题来自 minimumSectionSize()
,默认情况下,该值取决于字体和排序指示符与每个 header 部分的文本之间的边距,因此,即使使用 Stretch,列也不会不要调整到该宽度以下。
通过将最小大小设置为 0,我们可以防止这种行为。不过请记住,即使有 not-so-narrow 列(宽度小于 16-18 像素),您也根本看不到 header 文本,无论是否有足够的 space 对于要显示的文本:某些 space 始终保留给 header 部分分隔符及其边距。
关于文本对齐,标准方法是在每个项目上使用setTextAlignment
。如果您需要经常这样做,只需使用 QStandardItem 的子类,它会在初始化后自动设置其对齐方式。
from PyQt5 import QtCore, QtGui, QtWidgets
class FitTable(QtWidgets.QTableView):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
self.horizontalHeader().setMinimumSectionSize(0)
def resizeEvent(self, event):
super().resizeEvent(event)
if not self.model() or not self.model().columnCount():
return
# the text can be completely hidden on very narrow columns if the
# elide mode is enabled; let's disable it for widths lower than
# the average width of 3 characters
colSize = self.viewport().width() // self.model().columnCount()
if colSize < self.fontMetrics().averageCharWidth() * 3:
self.setTextElideMode(QtCore.Qt.ElideNone)
else:
self.setTextElideMode(QtCore.Qt.ElideRight)
class CenteredItem(QtGui.QStandardItem):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setTextAlignment(QtCore.Qt.AlignCenter)
class Window(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
layout = QtWidgets.QGridLayout(self)
self.table = FitTable()
layout.addWidget(self.table)
model = QtGui.QStandardItemModel()
self.table.setModel(model)
for row in range(5):
rowItems = []
for column in range(30):
# usually the text alignment is manually applied like this:
# item = QtGui.QStandardItem(str(column + 1))
#
# item.setTextAlignment(QtCore.Qt.AlignCenter)
#
# for convenience, I use a subclass that automatically does that
item = CenteredItem(str(column + 1))
rowItems.append(item)
model.appendRow(rowItems)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
如果我Table像下面提到的那样,
我想按照下面的步骤将所有列压缩到最小滚动条大小或没有滚动条,
在 QTable 中的 PyQt5 中查看如何将任何内容对齐到单元格的中心并希望滚动条最小化,如果可能的话没有滚动条也很好。
如下图文本未对齐,我希望按照图像 1 挤压所有列,并在 Python.
中将文本对齐到 PyQt5 的中心诀窍是使用水平 header 的 Stretch
调整大小模式,确保所有列适合视图的可用大小。唯一的问题来自 minimumSectionSize()
,默认情况下,该值取决于字体和排序指示符与每个 header 部分的文本之间的边距,因此,即使使用 Stretch,列也不会不要调整到该宽度以下。
通过将最小大小设置为 0,我们可以防止这种行为。不过请记住,即使有 not-so-narrow 列(宽度小于 16-18 像素),您也根本看不到 header 文本,无论是否有足够的 space 对于要显示的文本:某些 space 始终保留给 header 部分分隔符及其边距。
关于文本对齐,标准方法是在每个项目上使用setTextAlignment
。如果您需要经常这样做,只需使用 QStandardItem 的子类,它会在初始化后自动设置其对齐方式。
from PyQt5 import QtCore, QtGui, QtWidgets
class FitTable(QtWidgets.QTableView):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.horizontalHeader().setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
self.horizontalHeader().setMinimumSectionSize(0)
def resizeEvent(self, event):
super().resizeEvent(event)
if not self.model() or not self.model().columnCount():
return
# the text can be completely hidden on very narrow columns if the
# elide mode is enabled; let's disable it for widths lower than
# the average width of 3 characters
colSize = self.viewport().width() // self.model().columnCount()
if colSize < self.fontMetrics().averageCharWidth() * 3:
self.setTextElideMode(QtCore.Qt.ElideNone)
else:
self.setTextElideMode(QtCore.Qt.ElideRight)
class CenteredItem(QtGui.QStandardItem):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.setTextAlignment(QtCore.Qt.AlignCenter)
class Window(QtWidgets.QWidget):
def __init__(self):
QtWidgets.QWidget.__init__(self)
layout = QtWidgets.QGridLayout(self)
self.table = FitTable()
layout.addWidget(self.table)
model = QtGui.QStandardItemModel()
self.table.setModel(model)
for row in range(5):
rowItems = []
for column in range(30):
# usually the text alignment is manually applied like this:
# item = QtGui.QStandardItem(str(column + 1))
#
# item.setTextAlignment(QtCore.Qt.AlignCenter)
#
# for convenience, I use a subclass that automatically does that
item = CenteredItem(str(column + 1))
rowItems.append(item)
model.appendRow(rowItems)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())