Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用QScrollArea使滚动条显示_Python_Pyqt5_Qscrollarea - Fatal编程技术网

Python 如何使用QScrollArea使滚动条显示

Python 如何使用QScrollArea使滚动条显示,python,pyqt5,qscrollarea,Python,Pyqt5,Qscrollarea,我正在尝试使用pyqt5创建一个垂直布局的滚动区域,并在其中放置一些标签。我知道,即使是垂直布局,如果文本不适合,也应该水平滚动。但无论我尝试什么,它都不会让我滚动 这是我正在使用的代码: class window(QMainWindow): def __init__(self): super(window, self).__init__() self.setGeometry(300, 300, 803, 520) self.init_ui

我正在尝试使用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_())
下面是它的外观:

下面是它的外观:

我希望我的问题是清楚的

因为很多问题都想知道如何使用许多小部件所拥有的QScrollara,我将获得许可详细解释各种形式,并将它们作为未来读者的标准答案

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

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

1.使用QLayout: QLayouts允许您根据QSizePolicy、strecth、sizeHint等自动生成小部件的几何图形。因此,在这种情况下,很简单:只需将WidgetResizeable属性设置为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.直接设置小部件而不设置布局: 在这种情况下,您必须计算包含内部小部件的最小几何图形并设置容器中的大小,还必须将WidgetResizeable属性设置为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_())
由于许多问题都想知道如何使用许多小部件所拥有的QScrollArea,因此我将获得许可,详细解释各种形式,并将它们作为未来读者的标准答案

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

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

1.使用QLayout: QLayouts允许您根据QSizePolicy、strecth、sizeHint等自动生成小部件的几何图形。因此,在这种情况下,很简单:只需将WidgetResizeable属性设置为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.直接设置小部件而不设置布局: 在这种情况下,您必须计算包含内部小部件的最小几何图形并设置容器中的大小,还必须将WidgetResizeable属性设置为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_())

我将试着截图说明它应该是什么样子,以及它实际上是什么样子。截图有帮助,但不是我问你的问题。我知道,但我真的不知道如何以任何方式使问题变得更简单。我认为截图可以更好地理解我试图实现的目标。我理解问题的意义在于,由于你的图像,你得到了什么,你想要得到什么,但这还不够,因为它不允许我理解错误的原因,因此我需要MRE。如果您不提供,我将投票结束您的问题,然后继续我的方式如何更改问题以匹配MRE?我试图只包含与问题相关的必要代码。我会尽量提供更多的细节,很抱歉给你带来不便。我会尝试截图说明它应该是怎样的,以及它实际上是怎样的。截图有帮助,但不是我问你的问题。我知道,但我真的不知道如何使问题更简单。我认为截图可以更好地理解我试图实现的目标。我理解问题的意义在于,由于你的图像,你得到了什么,你想要得到什么,但这还不够,因为它不允许我理解错误的原因,因此我需要MRE。如果您不提供,我将投票结束您的问题,然后继续我的方式如何更改问题以匹配MRE?我试图只包含与问题相关的必要代码。我会尽量提供更多细节,不便之处,敬请原谅