如何在 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_())