2017-12-13 56 views
1

가변 길이의 텍스트를 포함하는 마지막 열이있는 QTableWidget이 있습니다.QHeaderView : 열의 내용 크기에 따른 스트레치 또는 ResizeToContents

QHeaderView의 마지막 섹션을 섹션의 크기에 따라 내용을 늘리거나 크기를 조정하려고합니다. 콘텐츠 크기가 위젯의 남은 공간을 초과하지 않는 경우 위젯에서 추한 공간이 생기지 않도록 늘리려합니다. setStretchLastSection(True)을 사용하여이 작업을 수행 할 수 있습니다. 그러나 내용 크기가 확장 된 열을 초과하면 열의 크기가 조정되지 않으므로 내용의 마지막 부분이 잘립니다. QHeaderView는이 경우에 ResizeToContents ResizeMode를 제공하지만 짧은 내용의 경우에는 위젯을 채워지지 않은 채로 둡니다.

필자는 수동으로 열 크기의 크기를 조정할 것을 고려했습니다. 죄송 합니다만 sectionSizeFromContents()이 (가) 보호되어 있으므로 콘텐츠 크기에 직접 액세스 할 수 없습니다. QHeaderView 하위 클래스 및 reimplement 수있을 것 같아요하지만 더 나은 솔루션이 있는지 궁금 해서요.

+0

보호 된 메서드는 pyqt에서 액세스 할 수 있습니다. python을 사용하지 않는 경우 pyqt 태그를 제거하십시오. 귀하의 질문에서. – ekhumoro

+0

pyqt5를 사용하고 있습니다. 'sectionSizeFromContents()'를 호출하려고 할 때, 다음 예외를 얻습니다 :'RuntimeError : 보호 된 함수 나 파이썬에서 생성되지 않은 객체에 대한 신호에 접근하지 못합니다. ' – tsabsch

+1

예, 단지'QHeaderView' 인스턴스를 생성하고 테이블에 설정하십시오. 하위 클래스를 만들 필요가 없습니다. – ekhumoro

답변

1

QHeaderView::sectionSizeFromContents()의 기능을 잘못 이해했습니다. 섹션에 속한 셀의 섹션 크기를 반환한다고 가정했지만이 정보는 물론 헤더에 저장 될 수 없습니다. 대신, 헤더 내용, 즉 주어진 레이블의 크기를 반환합니다.

그러나 열의 콘텐츠 크기를 QTableWidget::sizeHintForColumn()까지 가져올 수 있습니다.

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

ResizeMode::Stretch의 열 크기를 동일 : 내 표는 내가 사용할 수있는 두 번째 열의 나머지 공간을 계산하기 위해, 두 개의 열이 있습니다. 따라서 섹션 크기를 늘린 크기와 열의 크기 힌트의 최대 값으로 설정하여 문제를 해결할 수 있습니다.

size = max(table.sizeHintForColumn(1), stretched_size) 
table.horizontalHeader().resizeSection(1, size)