为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用QScrollArea让滚动条出现

如何使用QScrollArea让滚动条出现

弑天下 2023-07-18 14:58:02
我正在尝试使用 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, 0, 420, 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_())它应该是这样的:它看起来是这样的:
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

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


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


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


1.使用QLayout:

QLayouts 允许您根据 QSizePolicy、strecth、sizeHint 等自动调整小部件的几何形状。因此,在这种情况下很简单:只需将 widgetResizing 属性设置为 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, 10, 0, 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、直接设置widgets,无需布局:

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


import sys

from PyQt5 import QtCore, 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(False)


        container = QtWidgets.QWidget()

        scroll_area.setWidget(container)


        # calculate geometry

        geometry = QtCore.QRect(10, 10, 0, 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, 300, 803, 520)



if __name__ == "__main__":

    app = QtWidgets.QApplication(sys.argv)

    win = Window()

    win.show()

    sys.exit(app.exec_())


查看完整回答
反对 回复 2023-07-18
  • 1 回答
  • 0 关注
  • 116 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信