【问题标题】:PyQt: How to create a scrollable windowPyQt:如何创建一个可滚动的窗口
【发布时间】:2018-02-11 23:08:20
【问题描述】:

我认为在 PyQt 中创建可滚动窗口应该容易得多。 我有一个超出窗口的标签列表,我想向下滚动以查看它们。目前代码没有给我错误,但窗口只是没有出现:

class Example(QWidget):

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

        layout = QVBoxLayout()

        lbl_arr = makeLabelArr()

        for i in range(1,8):
            qb = lbl_arr[i]
            # qb.setFixedWidth(300)
            layout.addWidget(qb)

        layout.setAlignment(Qt.AlignTop)

        scroll = QScrollArea()
        scroll.setWidget(self)
        scroll.setWidgetResizable(True)
        scroll.setFixedHeight(400)

        layout.addWidget(scroll)

        self.setLayout(layout)


        self.setGeometry(0, 0, 600, 220)
        self.setWindowTitle('SnP watchlist')

        self.show()


if __name__ == '__main__':

    app = QApplication(sys.argv)
    #print(QDesktopWidget().availableGeometry())

    ex = Example()
    sys.exit(app.exec_())

【问题讨论】:

    标签: python pyqt scrollbar qscrollarea


    【解决方案1】:

    将窗口本身设为QScrollArea,如下所示:

    class Window(QScrollArea):
        def __init__(self):
            super(Window, self).__init__()
            widget = QWidget()
            layout = QVBoxLayout(widget)
            layout.setAlignment(Qt.AlignTop)
            for index in range(100):
                layout.addWidget(QLabel('Label %02d' % index))
            self.setWidget(widget)
            self.setWidgetResizable(True)
    

    【讨论】:

    • 我在不使用布局的情况下尝试了这个,但它不起作用。我没有从“QMainWindow”类继承,而是创建了一个“QWidget”对象并将其传递给我想要制作的每个“Q”项目。示例:pastebin.com/ZDKNXZPZ。这是一个错误的方法吗?我已经创建了没有布局的窗口。
    • @Filip 请ask a new question.
    • 不能那样做。不过还是谢谢。
    【解决方案2】:

    这里有一个例子:https://www.learnpyqt.com/tutorials/qscrollarea/

    from PyQt5.QtWidgets import (QWidget, QSlider, QLineEdit, QLabel, QPushButton, QScrollArea,QApplication,
                                 QHBoxLayout, QVBoxLayout, QMainWindow)
    from PyQt5.QtCore import Qt, QSize
    from PyQt5 import QtWidgets, uic
    import sys
    
    
    class MainWindow(QMainWindow):
    
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            self.scroll = QScrollArea()             # Scroll Area which contains the widgets, set as the centralWidget
            self.widget = QWidget()                 # Widget that contains the collection of Vertical Box
            self.vbox = QVBoxLayout()               # The Vertical Box that contains the Horizontal Boxes of  labels and buttons
    
            for i in range(1,50):
                object = QLabel("TextLabel: "+str(i))
                self.vbox.addWidget(object)
    
            self.widget.setLayout(self.vbox)
    
            #Scroll Area Properties
            self.scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
            self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
            self.scroll.setWidgetResizable(True)
            self.scroll.setWidget(self.widget)
    
            self.setCentralWidget(self.scroll)
    
            self.setGeometry(600, 100, 1000, 900)
            self.setWindowTitle('Scroll Area Demonstration')
            self.show()
    
            return
    
    def main():
        app = QtWidgets.QApplication(sys.argv)
        main = MainWindow()
        sys.exit(app.exec_())
    
    if __name__ == '__main__':
        main()
    

    【讨论】:

      【解决方案3】:

      您应该在添加scroll bar 小部件后设置layout

      class Example(QWidget):
      
          def __init__(self):
              super().__init__()
      
              layout = QVBoxLayout()
      
              lbl_arr = makeArrayOfLabelsHTML()
      
              for i in range(1,8):
                  qb = lbl_arr[i]
                  layout.addWidget(qb)
      
              layout.setAlignment(Qt.AlignTop)
      
              scroll = QScrollArea()
              scroll.setWidget(self)
              scroll.setWidgetResizable(True)
              scroll.setFixedHeight(400)
              layout.addWidget(scroll)
      
              # set layout after adding scroll bar 
              self.setLayout(layout)
      
              self.setGeometry(0, 0, 600, 220)
              self.setWindowTitle('SnP watchlist')
      
              self.show()
      
      
      
      if __name__ == '__main__':
      
              app = QApplication(sys.argv)
              #print(QDesktopWidget().availableGeometry())
      
              ex = Example()
              sys.exit(app.exec_())
      

      【讨论】:

      • 谢谢你,但即使我没有收到错误,窗口也不会显示
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      • 2019-06-20
      • 2011-07-29
      • 1970-01-01
      相关资源
      最近更新 更多