Search code examples
pythonpyqtpyqt4qscrollarea

How to create one scrollarea in pyqt


I am developing a scroll area widget with a height of 300 and adding QLabel Widgets in the scroll area, each QLabel height is 100. When adding more than 2 QLabel, the QLabel in the scroll area overlaps, and the scroll bar does not It shows that I have no way to pull the scroll bar. I want to separate the QLabel from each other. At the same time, I can pull down the scroll bar to see the remaining QLabel

from PyQt4 import QtCore
from PyQt4.QtGui import QScrollArea, QLabel, QVBoxLayout
import sys
from PyQt4 import QtGui


class ScrollArea(QScrollArea):
    def __init__(self):
        super(ScrollArea, self).__init__()
        self.setFixedSize(500, 300)
        self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
        self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)

        vbox = QVBoxLayout()
        self.setLayout(vbox)
        for i in range(4):
            lb = QLabel('hjkmlasda')
            lb.setStyleSheet("""
              border-width: 1px;
             border-style: solid;
             border-color:blue;
            """)
            lb.setFixedSize(400, 100)
            vbox.addWidget(lb)
            vbox.addStretch(1)


class Example(QtGui.QWidget):

    def __init__(self):
        super(Example, self).__init__()

        self.initUI()

    def initUI(self):
        h = QtGui.QHBoxLayout()
        h.addWidget(ScrollArea())
        self.setLayout(h)

        self.setGeometry(100, 100, 1000, 500)
        self.show()


def main():
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

Solution

  • You don't have to set a layout in the QScrollArea but a widget, so how do I put several widgets? Well, you must use a QWidget as a container and set the widget through a layout assigned to the container, and also enable the widgetResizable property:

    class ScrollArea(QtGui.QScrollArea):
        def __init__(self, parent=None):
            super(ScrollArea, self).__init__(parent)
            self.setFixedSize(500, 300)
            self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
            self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
            self.setWidgetResizable(True)
    
            container = QtGui.QWidget()
            self.setWidget(container)
            vbox = QtGui.QVBoxLayout(container)
            # vbox.setSpacing(0)
            for i in range(4):
                lb = QtGui.QLabel("hjkmlasda")
                lb.setStyleSheet(
                    """
                    border-width: 1px;
                    border-style: solid;
                    border-color:blue;
                """
                )
                lb.setFixedSize(400, 100)
                vbox.addWidget(lb)