PySide を使用してコンピューターアプリケーションを開発しており、QTableWidgetを使用しています。私のテーブルには3つの列があるが、そこに含まれるデータは非常に異なり、最初の列に長い文があり、最後の2つの列に3桁の数字があるとしましょう。 データに合わせてサイズを変更するためにテーブルのサイズを変更する、または少なくともできるように列サイズを(たとえば)70/15/15に設定する使用可能なスペースの%。
これを行う最良の方法は何ですか?
私はtable.horizontalHeader().setResizeMode(QHeaderView.Stretch)
を読んで この質問 を試しましたが、同じサイズの3つの列を作成します。
Fabio の comment のおかげでtable.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)
も試しましたが、必要に応じて利用可能なすべてのスペースを埋めることはできません。
QHeaderViewドキュメント のInteractive
、Fixed
、Stretch
、ResizeToContents
のいずれも、必要なものを提供してくれないようです( 2番目の編集を参照してください)。
Qt/C++ の場合でも、どんな助けでも大歓迎です!どうもありがとうございました。
編集:回避策を見つけましたが、まだ探しているものではありません。
header = table.horizontalHeader()
header.setResizeMode(QHeaderView.ResizeToContents)
header.setStretchLastSection(True)
setStretchFirstSection
メソッドが存在する方が良いでしょうが、残念ながら、存在しないようです。
編集2:
テーブルで変更できるのは最後の列のみで、ユーザーはそこに数字を入力できます。赤い矢印は、私が欲しいものを示しています。
Stretch
で起こることは次のとおりです。
ResizeToContents
で起こることは次のとおりです。
これは、各列のサイズ変更モードを設定することで解決できます。最初のセクションは、利用可能なスペースを占有するために伸びる必要がありますが、最後の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)
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)
これを行うには、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を追加するなど)。
前述のように、各列のサイズ変更モードを設定することでこれを行うことができます。ただし、多くの列がある場合、これは多くのコードになります。私がそれを行う方法は、「一般的な」サイズ変更モードを「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)