2017-12-21 11 views
1

1つのQScrollAreaに1つまたは複数のQGroupBoxを挿入しようとしています。Python + PyQt5:1つまたは複数の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.Actuallyで私はレイアウトを理解していないので、今すぐPyQtをやっています。 –

+0

QScrollAreaには既にviewport()が設定されているデフォルトレイアウトがありますスクロールのプロパティを削除します。 – eyllanesc

関連する問題