一、序言
我是自学Pyqt6的,当然也包括Python。我学Python和Pyqt6的目的是为了实现办公自动化或提升办公效率。但我发现讲Pyqt6 QScrollArea的教程很少,现在我也基本搞明白了。本篇教程将从建立一个主窗口开始,一步步实现使用 Pyqt6 QScrollArea 创建一个可自动显示滑动条的窗口。
二、建立主窗口
# 导入需要的模块
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QScrollArea
from PyQt6 import QtCore
import sys
# 主窗口类
class MainWindow(QMainWindow):
def __init__(self) -> None:
super().__init__()
# 设置主窗口大小
self.setGeometry(QtCore.QRect(500, 200, 400, 300))
# 设置主窗口标题
self.setWindowTitle("实例一")
# 创建局部变量tempQWidget,将用于主窗口的中央组件
tempQWidget = QWidget(parent=self)
# 设置局部变量tempQWidget窗口大小
tempQWidget.setGeometry(QtCore.QRect(0, 0, 400, 300))
# 将主窗口的中央组件设置为局部变量tempQWidget
self.setCentralWidget(tempQWidget)
# 显示窗口
self.show()
if __name__ == "__main__":
App = QApplication(sys.argv)
mainWindow = MainWindow()
sys.exit(App.exec())
通过上述代码,我们创建了一个继承自QMainWindow类的MainWindow类,这将是我们程序运行的主窗口。具体如何实现的不是本篇的讨论内容,代码中的标注可以帮助你理解。
三、创建QScrollArea
1、QScrollArea的结构
打开Qt Designer并创建一个QScrollArea,在对象检查器中,我们发现,创建了一个QScrollArea(①),它包含一个子物件QWidget(②,一般被命名为scrollAreaWidgetContents)。当scrollAreaWidgetContents的大小大于QScrollArea的大小,会自动显示滑动条。
2、代码
# 导入需要的模块
from PyQt6.QtWidgets import QApplication, QMainWindow, QWidget, QScrollArea
from PyQt6 import QtCore
import sys
# 主窗口类
class MainWindow(QMainWindow):
def __init__(self) -> None:
super().__init__()
# 设置主窗口大小
self.setGeometry(QtCore.QRect(500, 200, 400, 300))
# 设置主窗口标题
self.setWindowTitle("实例一")
# 创建局部变量tempQWidget,将用于主窗口的中央组件
tempQWidget = QWidget(parent=self)
# 设置局部变量tempQWidget窗口大小
tempQWidget.setGeometry(QtCore.QRect(0, 0, 400, 300))
# 将主窗口的中央组件设置为局部变量tempQWidget
self.setCentralWidget(tempQWidget)
# 从此开始
# 创建scrollArea,设置其父类为主窗口的中央组件
self.scrollArea = QScrollArea(parent=self.centralWidget())
# 设置scrollArea大小
self.scrollArea.setGeometry(QtCore.QRect(-1, -1, 401, 301))
# 取消scrollArea自动设置大小
self.scrollArea.setWidgetResizable(False)
# 创建局部变量tempScrollAreaWidgetContents
tempScrollAreaWidgetContents = QWidget()
# 设置tempScrollAreaWidgetContents的scrollAreaWidgetContents的大小
tempScrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 399, 299))
# 设置scrollArea的scrollAreaWidgetContents为tempScrollAreaWidgetContents
self.scrollArea.setWidget(tempScrollAreaWidgetContents)
# 到此结束
# 显示窗口
self.show()
if __name__ == "__main__":
App = QApplication(sys.argv)
mainWindow = MainWindow()
sys.exit(App.exec())
*需要添加的代码在中间,从标注的“从此开始”到标注的“到此结束”。
需要注意的是:
①:若scrollArea使用的父级窗口的类型是QMainWindow,则scrollArea的父级须设置为 QMainWindow.centralWidget();其他则为一般父级。
②:一定要把scrollArea的WidgetResizable设置为False,即代码self.scrollArea.setWidgetResizable(False),不然scrollArea会自动设置scrollAreaWidgetContents的大小为scrollArea的大小,使其无法正常显示滑动条。
四、实现自动显示滑动条
# 实现显示滑动条
def ShowScrollBar(self) -> None:
self.scrollArea.widget().setGeometry(0, 0, 500, 600)
为我们的MainWindow类添加类方法,如上,即可实现。需要注意的是:需要手动设置ScrollAreaWidgetContents的大小,其可通过scrollArea.widget()方程。