pyqt 动态增加控件,动态删除控件示例

示例描述:

点击“增加”按钮,在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_())

代码可直接复制到编译器运行查看效果,如有错误,还望小伙伴们在评论区批评指正。提前感谢!

猜你喜欢

转载自blog.csdn.net/weixin_53989417/article/details/128621788