2017-12-13 27 views
1

可変長のテキストを含む最後の列を持つQTableWidgetがあります。QHeaderView:列のコンテンツサイズに基づくストレッチまたはResizeToContents

QHeaderViewの最後のセクションをセクションのサイズに基づいて内容に伸ばしたり、サイズを変更したりします。コンテンツのサイズがウィジェットの残りのスペースを超えていない場合、私はそれを伸ばす(ウィジェット内の醜い、埋められていないスペースを防ぐために)。私はsetStretchLastSection(True)を使ってこれを達成することができます。ただし、コンテンツのサイズが伸長された列を超える場合、列のサイズが変更されないため、コンテンツの最後の部分が切り取られます。 QHeaderViewはこの場合にはResizeToContents ResizeModeを提供しますが、短いコンテンツの場合はウィジェットに空白が残ります。

手動で列のサイズを変更することを考えました。残念ながら、sectionSizeFromContents()は保護されているため、コンテンツサイズに直接アクセスすることはできません。私は、QHeaderViewをサブクラス化して再実装することができると思いますが、より良いソリューションがあるかどうかは疑問でした。

+0

保護されたメソッドはpyqtでアクセスできます。pythonを使用しない場合は、pyqtタグを削除してくださいあなたの質問から。 – ekhumoro

+0

私はpyqt5を使用しています。 'sectionSizeFromContents()'をコールしようとすると、次の例外が発生します。 'RuntimeError:保護された関数やPythonから作成されていないオブジェクトのシグナルにアクセスできません。 – tsabsch

+1

はい、 'QHeaderView'のインスタンスを作成し、それをテーブルに設定するだけです。サブクラスを作成する必要はありません。 – ekhumoro

答えて

1

私はQHeaderView::sectionSizeFromContents()の機能を誤解しました。セクションに属するセルのセクションサイズを返すと仮定しましたが、この情報はもちろんヘッダーに格納することはできません。代わりに、ヘッダーコンテンツのサイズ、つまり指定されたラベルを返します。

ただし、列のコンテンツサイズをQTableWidget::sizeHintForColumn()で取得することは可能です。

stretched_size = table.viewport().size().width() - table.horizontalHeader().sectionSize(0) 

ResizeMode::Stretchの列サイズに等しい:私のテーブルには、私が使用可能な第2の列の残りのスペースを計算するために、唯一の2つの列があります。したがって、セクションサイズを伸ばしたサイズとカラムのサイズヒントの最大値に設定することで問題を解決できます。

size = max(table.sizeHintForColumn(1), stretched_size) 
table.horizontalHeader().resizeSection(1, size) 
関連する問題