一个或多个QGroupBox如何使用QScrollArea?
How to use QScrollArea for one or many QGroupBox?
我一直在尝试将one/many 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_())
我想实现这个效果。 (只是为了表示)但是上面的代码没有显示滚动条。
您的代码存在以下问题:
QScrollArea不一定要加布局,传的是widget,所以你建好的layout必须加到widget上,widget必须设置为QScrollArea.
每次调用 createLayout_group 时都会覆盖 class self.groupbox、self.layout_groupbox 等的成员,这是不必要的,可以导致问题,该方法对QGroupBoxreturn是正确的。
另一个错误是,如果你使用setWidgetResizable(False)
,内部的widget会收缩,不好看
另一个问题是你不应该设置一个固定的大小,而只能设置一个固定的宽度,如果你想设置一个固定的大小,那么你应该使滚动条始终可见。
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()
输出:
我一直在尝试将one/many 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_())
我想实现这个效果。 (只是为了表示)但是上面的代码没有显示滚动条。
您的代码存在以下问题:
QScrollArea不一定要加布局,传的是widget,所以你建好的layout必须加到widget上,widget必须设置为QScrollArea.
每次调用 createLayout_group 时都会覆盖 class self.groupbox、self.layout_groupbox 等的成员,这是不必要的,可以导致问题,该方法对QGroupBoxreturn是正确的。
另一个错误是,如果你使用
setWidgetResizable(False)
,内部的widget会收缩,不好看另一个问题是你不应该设置一个固定的大小,而只能设置一个固定的宽度,如果你想设置一个固定的大小,那么你应该使滚动条始终可见。
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()
输出: