簡體   English   中英

調整列寬以適應 QTableWidget pyqt

[英]Resize column width to fit into the QTableWidget pyqt

我已經用谷歌搜索了,但我無法找到解決我的問題的方法。

我有一個帶有 2 列的 QTableWidget,我想要做的是讓它們對整個小部件可見,而不會出現水平滾動條。

一張圖就應該很清楚了:

在此處輸入圖像描述

我使用 Qt Designer 來創建 UI 和一些代碼來填充所有小部件和其他東西。

因此,首先我將 th2 2 列的大小調整為以下內容:

self.statTable.resizeColumnToContents(0)
self.statTable.resizeColumnToContents(1)

它可以工作,但是 Widget 沒有調整到 2 列的寬度。

這在 PyQt5 中有一個非常簡單的解決方案。 您需要做的就是在初始化 UI 時在表格上設置大小調整策略,它會自動調整大小以適應內容。 這可以通過 Qt 設計器(在屬性編輯器的 QAbstractScrollArea 部分)或以編程方式完成,如下所示:

    self.statTable.setSizeAdjustPolicy(
        QtWidgets.QAbstractScrollArea.AdjustToContents)

然后你只需要做:

    self.statTable.resizeColumnsToContents()

每當表重新填充時。

對於 PyQt4,一切都必須手動計算,還需要一些 hack 才能獲得完全一致的結果。 下面的演示腳本對我來說沒問題,但是 YMMV:

import random
from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.table = QtGui.QTableWidget(5, 2, self)
        self.button = QtGui.QPushButton('Populate', self)
        self.button.clicked.connect(self.populate)
        layout = QtGui.QGridLayout(self)
        layout.addWidget(self.table, 0, 0)
        layout.addWidget(self.button, 1, 0)
        layout.setColumnStretch(1, 1)

    def populate(self):
        words = 'Red Green Blue Yellow Black White Purple'.split()
        length = random.randint(2, len(words))
        self.table.setRowCount(random.randint(3, 30))
        for column in range(self.table.columnCount()):
            for row in range(self.table.rowCount()):
                item = QtGui.QTableWidgetItem(' '.join(
                    random.sample(words, random.randint(1, length))))
                self.table.setItem(row, column, item)

        self.table.setVisible(False)
        self.table.verticalScrollBar().setValue(0)
        self.table.resizeColumnsToContents()
        self.table.setVisible(True)
        self.setTableWidth()

    def setTableWidth(self):
        width = self.table.verticalHeader().width()
        width += self.table.horizontalHeader().length()
        if self.table.verticalScrollBar().isVisible():
            width += self.table.verticalScrollBar().width()
        width += self.table.frameWidth() * 2
        self.table.setFixedWidth(width)

    def resizeEvent(self, event):
        self.setTableWidth()
        super(Window, self).resizeEvent(event)

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(700, 150, 800, 400)
    window.show()
    sys.exit(app.exec_())

對於 Qt Designer 中表格小部件的自動調整設置,您可以在對象檢查器中查看表格小部件,您可以向下鑽取到它,如下所示。

在此處輸入圖片說明

(PyQt5)

對我來說,問題是最右邊的列中的單元格是多行的( QPlainTextEdit ),我想要自動換行……但我也希望最右邊的列擴展以填充父容器。

似乎你可以在 PyQt5 設計器中做你需要的一切,在你的QTableView的屬性編輯器中:

  • 在“QTableView”部分檢查“wordWrap”
  • 在“QAbstractScroll”部分檢查“AdjustToContents”(如Crap Phone所述)
  • 在“Header”部分檢查“horizo​​ntalHeaderStretchLastSection”

然后生成以下類型的代碼:

self.history_table_view.setSizeAdjustPolicy(QtWidgets.QAbstractScrollArea.AdjustToContentsOnFirstShow)
self.history_table_view.horizontalHeader().setStretchLastSection(True )

"word wrap = True" 似乎是默認設置,所以什么都沒有顯示,但它會是這樣的:

self.history_table_view.setWordWrap(True)

在調用 your_tablewidget.setItem() 后,每次都使用 your_tablewidget.resizeColumnsToContents()。 您不需要任何其他設置。

你知道試試,tableWidget.resize(1200, 600) *你可以改變分辨率,但這是你的答案......

暫無
暫無

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

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