2017-11-14 24 views
2

저는 PySide를 통해 액세스하는 Qt에 비교적 익숙하지 않습니다.QScrollArea의 적당한 너비를 설정하십시오.

필자는 세로로 스크롤 할 수있게 만들고 싶은 콘텐츠 목록을 보유하고 있습니다. 가로 크기는 문제가되지 않습니다. 나는 그것에 대해 QScrollArea을 사용해 보았습니다.

import sys 

import PySide.QtGui as gui 

application = gui.QApplication(sys.argv) 

window = gui.QScrollArea() 
list = gui.QWidget() 
layout = gui.QVBoxLayout(list) 

for i in range(100): 
    layout.addWidget(gui.QLabel(
     "A something longish, slightly convoluted example text.")) 

window.setWidget(list) 

window.show() 

sys.exit(application.exec_()) 

어떻게됩니까 :

  1. 하는 스크롤 영역은 라벨

  2. 그것은 수직 공간이 있음을 통지에 필요한 크기로 수평 크기를 설정 여기에 최소한의 예입니다 부족하기 때문에 세로 스크롤 막대가 추가됩니다.

  3. 세로 스크롤 막대로 인해 가로 공간이 부족하기 때문에 가로 스크롤 막대도 표시됩니다.

나는 수평 스크롤 멀리 setHorizontalScrollBarPolicy에 갈 수 있도록 할 수 있지만 큰 문제는 지속 : 수직 스크롤 바는 라벨의 일부를 가린다.

가로 스크롤 막대가 필요없는 최소 값으로 스크롤 영역의 너비를 어떻게 설정할 수 있습니까?

답변

2

귀하의 예는, 다소 비현실적이다. 더 일반적으로, 이는 하위 위젯 일 것이고 초기 크기는 레이아웃에 의해 결정되며 다른 위젯 및/또는 레이아웃의 크기에 의해 간접적으로 제한됩니다. 최상위 창으로 제약 조건은 다르며 부분적으로 창 관리자의 영향을받습니다 (정확한 동작은 플랫폼에 따라 다를 수 있음).

스크롤 영역의 크기가 올바른지 확인하려면 내용에 따라 스크롤 영역의 너비를 최소로 설정하고 세로 스크롤 막대와 프레임을 허용해야합니다. widgetResizable 속성을 True으로 설정하고 내용 레이아웃의 끝에 확장 가능한 스페이서를 추가하는 것이 가장 좋습니다.

아래 예에서는 라벨의 배경색을 변경하여 무엇이 진행되고 있는지 쉽게 볼 수 있도록했습니다. 또한 창 크기를 초기 크기보다 더 작은 크기로 조정할 수 있도록 표시 한 후 최소 너비를 다시 설정합니다.하지만 선택 사항입니다.

import sys 

import PySide.QtGui as gui 

application = gui.QApplication(sys.argv) 

window = gui.QScrollArea() 
window.setWidgetResizable(True) 
list = gui.QWidget() 
layout = gui.QVBoxLayout(list) 

# just for testing 
window.setStyleSheet('QLabel {background-color: red}') 

for i in range(30): 
    layout.addWidget(gui.QLabel(
     "A something longish, slightly convoluted example text.")) 

layout.addStretch() 

window.setWidget(list) 

window.setMinimumWidth(
    list.sizeHint().width() + 
    2 * window.frameWidth() + 
    window.verticalScrollBar().sizeHint().width()) 

window.show() 

# allow resizing smaller 
window.setMinimumWidth(1) 

sys.exit(application.exec_()) 
+0

예, 주 창인 QScrollArea는 예제의 일부입니다. 실제 응용 프로그램에서는 QStackedWidget 안에 있습니다. – kne

+0

@kne. 어느 쪽이든, 내 대답은 올바른 해결책입니다. 너는 그것을 실제로 시도 했는가? – ekhumoro

+0

괜찮습니다. 고마워요. 나는 그 이유를 이해하지 못합니다. IIUC,'list.layout(). getContentsMargins (2)'는'layout.contentsMargins(). right()'와 동일합니다. 왼쪽 여백은 어때? 시각적으로 네 가지 방향 모두에 여백이 있습니다. 왼쪽 마진은 이미'window.verticalScrollBar()에 포함되어 있습니까?sizeHint(). width()'? – kne

0

위젯에서 sizeHint()를 사용하고 결과를 사용하여 QScrollArea의 최소 너비를 설정하십시오. 여기

일부 추가 정보 : 스크롤 영역이 최상위 창을 이루어지기 때문에 http://doc.qt.io/qt-5/layout.html

+0

내가 실수하지 않으면 수직 스크롤 막대, 프레임 및 여백에 필요한 공간이 포함되지 않습니다. – kne

+0

당신 말이 맞아요. 수직 스크롤 바의 스페이스는 고려되어 있지 않습니다. 나는 이전 코멘트에 이것을 추가하는 것을 잊었다. – draentropia