如何滚动 'QMainWindow'

How To Scroll in 'QMainWindow'

我刚开始 learn/use PyQt 实习,但在寻找如何向这个简单程序添加滚动条时遇到了一些问题:

class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(300,300,180,100)

        self.button1= QPushButton(self)
        self.button1.setText("Button 1")
        self.button1.move(10,10)

        self.button2= QPushButton(self)
        self.button2.setText("Button 2")
        self.button2.move(150,10)

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

本质上,window 有一个固定大小(这里是 180x100)但有超出该大小的元素(即 button2 范围从 150 到 220,这使得它超出了 180px 的一半 window )

单击并拖动更大的 window 可以显示整个 button2,这很好,但我需要一种方法来保持 window 的大小并且只需要一个滚动条即可查看所有看不见的物品。

QScrollArea class 提供到另一个小部件的滚动视图。 更多... https://doc.qt.io/qt-5/qscrollarea.html

滚动区域用于在框架内显示子窗口小部件的内容。 如果小部件超过框架的大小,视图可以提供滚动条以便 可以查看子部件的整个区域。 必须使用 setWidget().

指定子小部件
import sys
from PyQt5.Qt import *


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 180, 100)

        self.scroll = QScrollArea()          
        self.widget = QWidget() 
        self.widget.resize(280, 200) 
        self.scroll.setWidget(self.widget)
        
        self.button1= QPushButton(self.widget)
        self.button1.setText("Button 1")
        self.button1.move(10, 10)

        self.button2= QPushButton(self.widget)
        self.button2.setText("Button 2")
        self.button2.move(150, 10)        
        
        self.setCentralWidget(self.scroll)
       

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