web-dev-qa-db-ja.com

PySide-PyQt:利用可能なスペースの割合としてQTableWidgetの列幅を設定する方法は?

PySide を使用してコンピューターアプリケーションを開発しており、QTableWidgetを使用しています。私のテーブルには3つの列があるが、そこに含まれるデータは非常に異なり、最初の列に長い文があり、最後の2つの列に3桁の数字があるとしましょう。 データに合わせてサイズを変更するためにテーブルのサイズを変更する、または少なくともできるように列サイズを(たとえば)70/15/15に設定する使用可能なスペースの%

これを行う最良の方法は何ですか?

私はtable.horizontalHeader().setResizeMode(QHeaderView.Stretch)を読んで この質問 を試しましたが、同じサイズの3つの列を作成します。

Fabiocomment のおかげでtable.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)も試しましたが、必要に応じて利用可能なすべてのスペースを埋めることはできません。

QHeaderViewドキュメントInteractiveFixedStretchResizeToContentsのいずれも、必要なものを提供してくれないようです( 2番目の編集を参照してください)。

Qt/C++ の場合でも、どんな助けでも大歓迎です!どうもありがとうございました。


編集:回避策を見つけましたが、まだ探しているものではありません。

header = table.horizontalHeader()
header.setResizeMode(QHeaderView.ResizeToContents)
header.setStretchLastSection(True)

setStretchFirstSectionメソッドが存在する方が良いでしょうが、残念ながら、存在しないようです。


編集2:

テーブルで変更できるのは最後の列のみで、ユーザーはそこに数字を入力できます。赤い矢印は、私が欲しいものを示しています。

Stretchで起こることは次のとおりです。Stretch

ResizeToContentsで起こることは次のとおりです。ResizeToContents

10
AdrienW

これは、各列のサイズ変更モードを設定することで解決できます。最初のセクションは、利用可能なスペースを占有するために伸びる必要がありますが、最後の2つのセクションはコンテンツに合わせてサイズを変更します。

PyQt4:

header = self.table.horizontalHeader()
header.setResizeMode(0, QtGui.QHeaderView.Stretch)
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents)

PyQt5:

header = self.table.horizontalHeader()       
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)
30
ekhumoro

PyQt4

header = self.table.horizontalHeader()
header.setResizeMode(0, QtGui.QHeaderView.Stretch)
header.setResizeMode(1, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(2, QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(3, QtGui.QHeaderView.Stretch)

PyQt5

header = self.table.horizontalHeader()       
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
header.setSectionResizeMode(1, QtWidgets.QHeaderView.ResizeToContents)
header.setSectionResizeMode(2, QtWidgets.QHeaderView.ResizeToContents)
header.setSectionResizeMode(3, QtWidgets.QHeaderView.Stretch)
5
Xavi Martínez

これを行うには、QItemDelegatesまたはQStyledItemDelegatesを使用します。内容に合わせてサイズを変更したい場合and自動ストレッチを使用する場合、どの列が「ストレッチ」列であるかを選択する必要があります。

class ResizeDelegate(QStyledItemDelegate):

    def __init__(self, table, stretch_column, *args, **kwargs):
        super(ResizeDelegate, self).__init__(*args, **kwargs)        
        self.table = table
        self.stretch_column = stretch_column

    def sizeHint(self, option, index):
        size = super(ResizeDelegate, self).sizeHint(option, index)
        if index.column() == self.stretch_column:
            total_width = self.table.viewport().size().width()
            calc_width = size.width()
            for i in range(self.table.columnCount()):
                if i != index.column():
                    option_ = QtGui.QStyleOptionViewItem()
                    index_ = self.table.model().index(index.row(), i)
                    self.initStyleOption(option_, index_)
                    size_ = self.sizeHint(option_, index_)
                    calc_width += size_.width()
            if calc_width < total_width:
                size.setWidth(size.width() + total_width - calc_width)
        return size

...

table = QTableWidget()
delegate = ResizeDelegate(table, 0)
table.setItemDelegate(delegate)
... # Add items to table
table.resizeColumnsToContents()

サイズ変更モードをResizeToContentsに設定するか、ユーザーが必要に応じて列幅を調整できるようにしたい場合は、テーブル項目に変更を加えた後、手動でresizeColumnsToContentsを呼び出します。

また、列間のマージンとパディングのために、幅の計算を少し調整する必要がある場合があります(セルの境界を考慮して各列のcalculated_widthにピクセルまたは2を追加するなど)。

3
Brendan Abel

前述のように、各列のサイズ変更モードを設定することでこれを行うことができます。ただし、多くの列がある場合、これは多くのコードになります。私がそれを行う方法は、「一般的な」サイズ変更モードを「ResizeToContent」に設定し、1つ(または複数)の列を「ストレッチ」に設定することです!

コードは次のとおりです。

PyQt4:

header = self.table.horizontalHeader()
header.setResizeMode(QtGui.QHeaderView.ResizeToContents)
header.setResizeMode(0, QtGui.QHeaderView.Stretch)

PyQt5:

header = self.table.horizontalHeader()
header.setSectionResizeMode(QtWidgets.QHeaderView.ResizeToContents)       
header.setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
2
koxx