如何使用QScrollArea使滚动条出现 1使用QLayout: 2直接设置无布局的小部件:

问题描述

我正在尝试使用pyqt5创建具有垂直布局的滚动区域,并且将一些标签放入其中。我知道即使是垂直布局,如果文本不合适也应该水平滚动。但是无论我尝试什么,都不会让我滚动。

这是我正在使用的代码

class window(QMainWindow):
    def __init__(self):
        super(window,self).__init__()
        self.setGeometry(300,300,803,520)
        self.init_ui()

    def init_ui(self):
        self.teacher_Box = QScrollArea(self)
        self.teacher_Box.setGeometry(360,10,420,181)
        self.teacher_Box.setWidgetResizable(True)
        self.teacher_Box.setobjectName("teacher_Box")
        self.teacher_Box_widget = QWidget()
        self.teacher_Box_widget.setGeometry(QtCore.QRect(0,181))
        self.teacher_Box_widget.setobjectName("teacher_Box_widget")
        self.verticalLayout = QVBoxLayout(self.teacher_Box_widget)
        self.verticalLayout.setobjectName("verticalLayout")
        self.teacher_Box.setWidget(self.teacher_Box_widget) 
        self.teacher_label = QtWidgets.QLabel(self.teacher_Box_widget)
        self.teacher_label.setText("This is a new text label that i created using pyqt5's qscrollarea and Now the label is going to get outside the boundaries")
        self.teacher_label.adjustSize()
        self.teacher_label.move(10,10)


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

这是它的外观:

enter image description here

这是它的外观:

enter image description here

我希望我的问题很清楚

解决方法

由于许多问题想知道如何使用许多小部件具有的QScrollArea,因此我将获得许可以详细解释各种形式,并将其用作将来读者的规范答案。

QScrollArea仅允许放置容器小部件,因此必须将其他小部件放置为容器小部件的子级。

要将小部件放置为另一个小部件,有两种可能性:

1。使用QLayout:

QLayouts允许您基于QSizePolicy,strecth,sizeHint等来自动化小部件的几何形状。因此,在这种情况下很简单:只需将widgetResizable属性设置为True。

import sys
from PyQt5 import QtWidgets


class Window(QtWidgets.QMainWindow):
    def __init__(self,parent=None):
        super(Window,self).__init__(parent)

        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)

        scroll_area = QtWidgets.QScrollArea(central_widget)
        scroll_area.setGeometry(360,10,420,180)
        scroll_area.setWidgetResizable(True)

        container = QtWidgets.QWidget()
        scroll_area.setWidget(container)

        # Set widgets via layout
        lay = QtWidgets.QVBoxLayout(container)
        lay.setContentsMargins(10,0)
        for letter in "ABCDE":
            text = letter * 100
            label = QtWidgets.QLabel(text)
            lay.addWidget(label)
        lay.addStretch()

        self.setGeometry(300,300,803,520)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())

2。直接设置无布局的小部件:

在这种情况下,您必须计算包含内部小部件的最小几何图形并在容器中设置尺寸,还必须将widgetResizable属性设置为False:

import sys
from PyQt5 import QtCore,QtWidgets


class Window(QtWidgets.QMainWindow):
    def __init__(self,180)
        scroll_area.setWidgetResizable(False)

        container = QtWidgets.QWidget()
        scroll_area.setWidget(container)

        # calculate geometry
        geometry = QtCore.QRect(10,0)
        for letter in "ABCDE":
            text = letter * 100
            label = QtWidgets.QLabel(text,container)
            label.adjustSize()
            label.move(geometry.bottomLeft())
            geometry |= label.geometry()

        geometry.setTopLeft(QtCore.QPoint(0,0))
        container.resize(geometry.size())

        self.setGeometry(300,520)


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    win = Window()
    win.show()
    sys.exit(app.exec_())