【问题标题】:How to make QScrollArea working properly?如何使 QScrollArea 正常工作?
【发布时间】:2020-07-25 00:17:18
【问题描述】:

我正在尝试将多个标签添加到 Qscrollarea,但它无法正常工作。我在滚动区域中添加了Qwidget,并在该Qwidget 中添加了标签。我加了self.scrollArea.setWidgetResizable(True) 仍然无法正常工作。

这是我使用 Qtdesigner 创建的文件的(一部分):

self.scrollArea = QtWidgets.QScrollArea(self.gridLayoutWidget)
self.scrollArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 457, 428))
self.scrollAreaWidgetContents.setMinimumSize(QtCore.QSize(0, 0))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.gridLayoutWidget_2 = QtWidgets.QWidget(self.scrollAreaWidgetContents)
self.gridLayoutWidget_2.setGeometry(QtCore.QRect(0, 0, 441, 431))
self.gridLayoutWidget_2.setObjectName("gridLayoutWidget_2")
self.gridLayout_2 = QtWidgets.QGridLayout(self.gridLayoutWidget_2)
self.gridLayout_2.setSizeConstraint(QtWidgets.QLayout.SetMinAndMaxSize)
self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
self.gridLayout_2.setObjectName("gridLayout_2")
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
self.gridLayout.addWidget(self.scrollArea, 1, 0, 1, 4)

我使用了另一个文件来运行程序:

for i in range(50) :
            self.ResultLabel = QtWidgets.QLabel(self.gridLayoutWidget)
            self.ResultLabel.setMinimumSize(QtCore.QSize(200, 30))
            self.ResultLabel.setWordWrap(True)
            self.ResultLabel.setFont(QtGui.QFont('Segoe UI',9))
            self.ResultLabel.setText(str(i))
            self.gridLayout_2.addWidget(self.ResultLabel, i, 0, 1, 2)

这就是我得到的:

【问题讨论】:

  • 为什么要使用第二个子小部件 (gridLayoutWidget_2)?这完全没有必要,只需将布局设置为scrollAreaWidgetContents。请注意,如果您使用的是由pyuic 生成的文件,您应该不要编辑它,因为这些文件应该始终用作导入的模块并且从不修改。阅读有关using Designer 的更多信息。
  • 我从未编辑过pyuic生成的文件。我刚刚将网格布局添加到 Designer 的滚动区域中。名称gridLayoutWidget_2 由设计器生成。
  • 我从来没有说过你这样做了,但由于你没有提供完整的minimal, reproducible example(你总是应该这样做),我宁愿澄清这一点,因为这是一个常见的错误。

标签: python qt user-interface pyqt5


【解决方案1】:

如果您需要一个由代码填充的空滚动区域,则不必从 Designer 中添加另一个小部件,因为它已经存在,即 scrollAreaWidgetContents

由于在创建滚动区域时内容小部件没有设置布局,因此您必须自己设置一个。您可以从代码中手动完成:

    self.contentsLayout = QtWidgets.QGridLayout(self.scrollAreaWidgetContents)

在上述情况下,请从设计器中删除gridLayoutWidget_2,因为它是不必要的。

或者,您也可以在 Designer 中通过一个小解决方法执行相同操作:

  • 向scrollAreaWidgetContents 小部件添加任何小部件(按钮、标签,都无所谓);您实际上已经有了这样一个小部件(您在其中创建的 gridLayoutWidget_2),因此您可以将其用于此目的;
  • 右键单击滚动区域,从“布局”子菜单中选择网格布局;
  • 删除之前添加的小部件(或您的情况下的gridLayoutWidget_2);

这是必需的,因为 Designer 不允许为小部件设置布局,除非它至少有一个子小部件。

【讨论】:

    猜你喜欢
    • 2019-10-08
    • 1970-01-01
    • 2021-08-10
    • 1970-01-01
    • 2018-07-06
    • 2012-05-28
    • 2021-09-24
    • 2023-03-13
    • 2016-02-21
    相关资源
    最近更新 更多