示例描述:
点击“增加”按钮,在scrollArea中会新增出一个名为hello的按钮,持续点击则持续增加,当增加到一定数量时,scrollArea会出现滑块。同理,点击“删除”按钮,则会由下至上删除名为hello的按钮,持续点击则会持续删除。(截图如下)
—— 该示例来自学习交流群内昵称为“罪人”的大佬,是这个小哥哥帮我写的,此处再次由衷感谢!
直接上代码,里面有注释,我就不一一拆开讲了:
import sys
from PyQt5.QtWidgets import (
QWidget,
QApplication,
QVBoxLayout,
QPushButton,
QSpacerItem,
QSizePolicy,
QScrollArea
)
class Test(QWidget):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.resize(800, 800)
# 创建来滚动条的窗口
self.scroll_area = QScrollArea(self)
self.scroll_area.resize(400, 400)
self.scroll_area.move(10, 100)
self.core_widget = QWidget()
self.scroll_area.setWidget(self.core_widget)
self.scroll_area.setWidgetResizable(True)
# 在窗口上创建 垂直布局
self.vlay = QVBoxLayout(self.core_widget)
# 动态增删
self.add_btn = QPushButton("增加", self)
self.del_btn = QPushButton("删除", self)
self.add_btn.move(50, 50)
self.del_btn.move(200, 50)
# 准备一个 弹簧
self.verSpacer = QSpacerItem(0, 0, QSizePolicy.Minimum, QSizePolicy.Expanding)
# 事件绑定
self.add_btn.clicked.connect(self.addBtn)
self.del_btn.clicked.connect(self.delBtn)
# 动态添加
def addBtn(self):
# 先移除 弹簧
self.vlay.removeItem(self.verSpacer)
btn = QPushButton("hello")
btn.setStyleSheet("background-color:#8a9fff;")
self.vlay.addWidget(btn)
# 再添加 弹簧
self.vlay.addItem(self.verSpacer)
# 删除按钮
def delBtn(self):
if len(self.core_widget.children()) == 1:
return
# 先移除 弹簧
self.vlay.removeItem(self.verSpacer)
# 最后一个按钮
end_btn = self.core_widget.children()[-1]
self.vlay.removeWidget(end_btn)
# 再添加 弹簧
self.vlay.addItem(self.verSpacer)
# 销毁按钮
end_btn.deleteLater()
if __name__ == '__main__':
app = QApplication(sys.argv)
win = Test()
win.show()
sys.exit(app.exec_())
代码可直接复制到编译器运行查看效果,如有错误,还望小伙伴们在评论区批评指正。提前感谢!