2017-12-21 5 views
1

하나의 QScrollArea에 여러 개의 QGroupBox를 삽입하려고했습니다.Python + PyQt5 : 하나 또는 여러 QGroupBox에 QScrollArea를 사용하는 방법은 무엇입니까?

문제는 스크롤 막대가 표시되지 않는 것입니다. 나는이 효과를 달성하고자하는

# -*- coding: utf-8 -*- 

from PyQt5.QtWidgets import QWidget 
from PyQt5.QtWidgets import QLabel 
from PyQt5.QtWidgets import QCheckBox 
from PyQt5.QtWidgets import QGroupBox 
from PyQt5.QtWidgets import QScrollArea 

from PyQt5.QtWidgets import QApplication 
from PyQt5.QtWidgets import QHBoxLayout, QVBoxLayout, QGridLayout 

import sys 

lst = [u"D", u"E", u"EF", u"F", u"FG", u"G", u"H", u"JS", u"J", u"K", u"M", u"P", u"R", u"S", u"T", u"U", u"V", u"X", u"Y", u"Z"] 

class MyApp(QWidget): 
    def __init__(self): 
     super(MyApp, self).__init__() 

     window_width = 1200 
     window_height = 600 
     self.setFixedSize(window_width, window_height) 

     self.initUI() 

    def createLayout_group(self): 
     self.groupbox = QGroupBox(u"Group1:") 
     self.layout_groupbox = QVBoxLayout() 

     for i in range(len(lst)): 
      self.item = QCheckBox(lst[i], self.groupbox) 
      self.layout_groupbox.addWidget(self.item) 
     self.layout_groupbox.addStretch(1) 

     self.groupbox.setLayout(self.layout_groupbox) 


    def createLayout_Container(self): 

     self.scrollarea = QScrollArea(self) 
     self.scrollarea.setFixedSize(250, 6000) 
     self.scrollarea.setWidgetResizable(False) 

     self.layout_SArea = QVBoxLayout() 
     self.layout_SArea.addWidget(self.groupbox) 
     self.layout_SArea.addWidget(self.groupbox) # add groupbox one more to test 
     self.layout_SArea.addWidget(self.groupbox) # add groupbox one more to test 
     self.layout_SArea.addStretch(1) 

     self.scrollarea.setLayout(self.layout_SArea) 



    def initUI(self): 
     self.createLayout_group() # load one groupbox 
     self.createLayout_Container() # load groupbox container 

     self.layout_All = QVBoxLayout() 
     self.layout_All.addWidget(self.scrollarea) 
     self.setLayout(self.layout_All) 

     self.show() 


if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    window = MyApp() 
    sys.exit(app.exec_()) 

:

여기 내 코드입니다. (다만 표현을 위해) 그러나 위의 코드는 스크롤러를 보여주지 않습니다.

enter image description here

답변

1

코드는 다음과 같은 문제가 있습니다

  • 당신은 QScrollArea에 레이아웃을 추가 할 필요가 없습니다, 당신이 통과해야하는 위젯은 당신이 구축하는 레이아웃 그래서입니다해야 위젯에 추가 될 수 있으며 해당 위젯은 QScrollArea로 설정되어야합니다.

  • createLayout_group을 호출 할 때마다 self.groupbox, self.layout_groupbox 등의 멤버를 덮어 쓰고 불필요하며 문제가 발생할 수 있으므로 해당 메소드가 QGroupBox를 반환하는 것이 옳습니다.

  • 다른 오류는 setWidgetResizable(False)을 사용하는 경우 내부 위젯이 계약되고 그 눈

  • 다른 문제에 기쁘게되지 않는 것입니다 당신이 고정 된 크기를 설정하지,하지만 고정 만해야한다는 것입니다 너비를 지정하려면 고정 크기를 설정하려면 스크롤 막대가 항상 표시되도록해야합니다.


lst = [u"D", u"E", u"EF", u"F", u"FG", u"G", u"H", u"JS", u"J", u"K", u"M", u"P", u"R", u"S", u"T", u"U", u"V", u"X", u"Y", u"Z"] 

class MyApp(QWidget): 
    def __init__(self): 
     super(MyApp, self).__init__() 
     window_width = 1200 
     window_height = 600 
     self.setFixedSize(window_width, window_height) 
     self.initUI() 

    def createLayout_group(self, number): 
     sgroupbox = QGroupBox("Group{}:".format(number), self) 
     layout_groupbox = QVBoxLayout(sgroupbox) 
     for i in range(len(lst)): 
      item = QCheckBox(lst[i], sgroupbox) 
      layout_groupbox.addWidget(item) 
     layout_groupbox.addStretch(1) 
     return sgroupbox 

    def createLayout_Container(self): 
     self.scrollarea = QScrollArea(self) 
     self.scrollarea.setFixedWidth(250) 
     self.scrollarea.setWidgetResizable(True) 

     widget = QWidget() 
     self.scrollarea.setWidget(widget) 
     self.layout_SArea = QVBoxLayout(widget) 

     for i in range(5): 
      self.layout_SArea.addWidget(self.createLayout_group(i)) 
     self.layout_SArea.addStretch(1) 

    def initUI(self): 
     self.createLayout_Container() 
     self.layout_All = QVBoxLayout(self) 
     self.layout_All.addWidget(self.scrollarea) 
     self.show() 

출력 :

enter image description here

+0

너무 감사합니다! 그것은 당신의 좋은 설명과 코드에 대해 당신에게 아주 친절합니다! 저는 정말로 PyQt의 초보자입니다. 정말 배워야 할 것이 많습니다. –

+0

안녕하세요 저는 Qscroll Area에서 레이아웃을 설정하면 어떻게 될지 물어보고 싶습니다. 사실 저는 지금 PyQt를하고 있으며 레이아웃을 이해하는 데 빠져 있습니다. –

+0

QScrollArea에는 이미 viewport()가 설정된 기본 레이아웃이 있습니다. if 당신이 그것을 설정하면 스크롤의 속성을 제거합니다. – eyllanesc

관련 문제