web-dev-qa-db-ja.com

QTableWidget pyqtに収まるように列幅を変更します

私はグーグルで調べましたが、私の問題の解決策を見つけることができません。

私は2列のQTableWidgetを持っていますが、私がやろうとしているのは、表示する水平スクロールバーなしでウィジェット全体にそれらを表示させることです。

写真を使用すると、すべてが明確になります。

enter image description here

私はQt Designerを使用してUIといくつかのコードを作成し、すべてのウィジェットやその他のものを埋めました。

そのため、最初にth2 2列のサイズをコンテンツに合わせて変更しました。

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

動作しますが、ウィジェットは2列幅にサイズ変更されません。

9
matteo

これはPyQt5で非常に簡単なソリューションを提供します。必要なことは、UIを初期化するときにテーブル上で サイズ調整ポリシーを設定 だけで、コンテンツに合わせて自動的にサイズ変更されます。これは、Qt Designerで実行するか、次のようにプログラムで実行できます。

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

それからあなたはただする必要があります:

    self.statTable.resizeColumnsToContents()

テーブルが再作成されるたびに。

PyQt4では、すべてを手動で計算する必要があり、完全に一貫した結果を得るにはいくつかのハックも必要です。以下のデモスクリプトは正常に機能しますが、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_())
18
ekhumoro