【发布时间】:2019-04-26 09:10:42
【问题描述】:
我遇到的问题完全让我发疯。
我正在使用 PyQt5 在 Python 上编写 GUI 应用程序。我的应用程序由多个 QGroupBoxes 组成,当用户在它们之间切换时它们变得可见和不可见。
其中一个 QGroupBoxes 包含 QScrollArea,其中放置了另一个 QGroupBoxes。当用户向应用程序添加信息时,可能会添加新的 QGroupBoxes,因此当添加的元素过多时,QScrollArea 应该允许查看所有这些。
所以元素的结构是:
QGroupBox
=>QScrollArea
=>=>QScrollAreaWidgetContents
=>=>=>QVBoxLayout
=>=>=>=>QGroupBox
=>=>=>=>=>QFormLayout
=>=>=>=>QGroupBox
=>=>=>=>=>QFormLayout
但是,即使我将内部 QGroupBoxes 放置在垂直布局中,然后放置在单个 QScrollAreaWidgetContents 中,QScrollArea 也不会显示任何滚动条,而是调整内部元素的大小,因此看起来像这样。
我的问题可以用这个例子来概括:
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(415, 213)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.groupBox = QtWidgets.QGroupBox(self.centralwidget)
self.groupBox.setGeometry(QtCore.QRect(0, 0, 801, 601))
self.groupBox.setObjectName("groupBox")
self.scrollArea = QtWidgets.QScrollArea(self.groupBox)
self.scrollArea.move(10, 30)
self.scrollArea.setFixedWidth(380)
self.scrollArea.setMinimumHeight(160)
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.move(0, 0)
self.scrollAreaWidgetContents.setFixedWidth(378)
self.scrollAreaWidgetContents.setMinimumHeight(158)
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
MainWindow.setCentralWidget(self.centralwidget)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
class competencyBox(QWidget):
def __init__(self, parent):
super(competencyBox, self).__init__(parent)
self.compCodeLineEdit = QLineEdit()
self.compDescrpTextEdit = QTextEdit()
self.box = QGroupBox(self)
self.form_lay = QFormLayout(self)
self.form_lay.addRow(QLabel("Код: "), self.compCodeLineEdit)
self.form_lay.addRow(QLabel("Описание: "), self.compDescrpTextEdit)
self.box.setLayout(self.form_lay)
self.box.setFixedSize(510, 240)
class test_window(QMainWindow):
def __init__(self):
super(test_window, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.addBox(self.ui.scrollAreaWidgetContents, competencyBox, 4)
def addBox(self, parent, element, number):
vert_lay = QVBoxLayout(parent)
for i in range(number):
e = element(parent)
vert_lay.addWidget(e)
vert_lay.setSpacing(5)
如你所见,我尝试了不同的方法,例如为内部 QGroupBoxes 设置固定大小、在垂直布局中添加间距等,但 QScrollArea 仍然忽略它们并缩小内部元素。我被卡住了,不知道如何解决我的问题。请帮我。
【问题讨论】:
-
这个人的问题与我几乎相同,但他的解决方案不适用于我:stackoverflow.com/questions/12781407/… 因为我已经将
setWidgetResizeable(True)应用于我的 QScrollArea。 -
mmmm,这跟我的要求有什么关系?
-
这个问题通常不是由 QScrollArea 引起的,而是由 OP 代码的另一部分引起的,所以这就是我向你要 MCVE 的原因
-
我建议您在以后的场合提供minimal reproducible example,代码片段可以很好地说明或解释问题,但不能解决问题:我想要 X,我做 Y,但它没有工作,因为错误可能在你代码的隐藏部分,我们永远不会知道,这就是为什么 SO 引入 MCVE 的概念
标签: python python-3.x pyqt pyqt5 qt-designer