簡體   English   中英

如何在 PyQt5 的 QTableview 中將列壓縮到最小?

[英]How to Squeeze the Column to minimum in QTableview in PyQt5?

如果我有如下所述的表格,

在此處輸入圖像描述

我想按以下方式將所有列壓縮到最小滾動條大小或沒有滾動條,

在此處輸入圖像描述

在 QTableview 的 PyQt5 中,如何將任何內容對齊到單元格的中心並希望最小滾動條,如果可能的話沒有滾動條,那么它也很好。

如下圖所示,圖像文本未對齊,我希望按照圖像 1 擠壓所有列,並將文本對齊到 Python 中 PyQt5 的中心。

在此處輸入圖像描述

訣竅是使用水平 header 的Stretch resize 模式,這可以確保所有列都適合視圖的可用大小。 唯一的問題來自minimumSectionSize() ,默認情況下,該值取決於字體和排序指示器與每個 header 部分的文本之間的邊距,因此,即使使用 Stretch,列也不會調整到低於該寬度的大小.
通過將最小大小設置為 0,我們可以防止這種行為。 但請記住,即使列不那么窄(寬度小於 16-18 像素),您也根本看不到 header 文本,無論是否有足夠的空間來顯示文本:始終為 header 部分分隔符及其邊距保留一些空間。

關於文本 alignment,標准做法是在每個項目上使用setTextAlignment 如果您需要經常這樣做,只需使用 QStandardItem 的子類,它會在初始化后自動設置其 alignment。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM