You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5中scrollAreaWidget刷新异常:新增按钮无法显示

解决PyQt5中新增按钮无法显示在滚动列表的问题

你的代码核心问题有两个:

  • 每次调用SetList都重复创建滚动区域相关控件:包括QScrollArea、滚动容器widget和布局,冗余操作会导致控件显示异常。
  • 在for循环内重复设置scrollArea的widget:每次添加按钮都调用self.scrollArea.setWidget(self.scrollAreaWidgetContents),完全没必要且会干扰控件渲染。

修改方案

在setupUi中一次性初始化滚动区域的基础控件,后续仅通过SetList更新列表内容,同时彻底清空旧控件避免布局混乱。

修改后的完整代码

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1500, 1000)
        MainWindow.setWindowTitle("Test")

        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.lineEditName = QLineEdit(self.centralwidget)
        self.lineEditName.setGeometry(QRect(20, 90, 860, 40))
        self.lineEditName.setFont(QFont("Times new roman",15))
        self.lineEditName.setText("")
        self.lineEditName.setToolTip("Name")
        self.lineEditName.setPlaceholderText("Name")

        self.pushButtonAdd = QPushButton(self.centralwidget)
        self.pushButtonAdd.setGeometry(QRect(20, 800, 120, 50))
        self.pushButtonAdd.setFont(QFont("Times new roman",20))
        self.pushButtonAdd.setText("Add")
        self.pushButtonAdd.clicked.connect(self.AddContact)

        # 一次性初始化滚动区域控件
        self.scrollArea = QScrollArea(self.centralwidget)
        self.scrollArea.setGeometry(QRect(1000, 90, 400, 680))
        self.scrollArea.setWidgetResizable(True)

        self.scrollAreaWidgetContents = QWidget()
        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
        self.verticalLayout = QVBoxLayout(self.scrollAreaWidgetContents)
        self.scrollArea.setWidget(self.scrollAreaWidgetContents)

        MainWindow.setCentralWidget(self.centralwidget)

    def AddContact(self):
        if self.lineEditName.text() != "":   
            Names.append(self.lineEditName.text())
            self.SetList()
            print(f"Success - Added {self.lineEditName.text()}")
            self.lineEditName.clear()  # 清空输入框提升体验
        else:
            print("Error: 输入不能为空")

    def SetList(self):
        # 清空布局中所有旧控件,避免内存泄漏
        while self.verticalLayout.count():
            item = self.verticalLayout.takeAt(0)
            widget = item.widget()
            if widget:
                widget.deleteLater()
        
        # 排序并重新添加按钮
        Names.sort()
        for name in Names:
            pushButtonList = QPushButton(self.scrollAreaWidgetContents)
            pushButtonList.setText(name)
            pushButtonList.setFont(QFont("Times new roman",14))
            self.verticalLayout.addWidget(pushButtonList)

if __name__ == "__main__":
    import sys
    Names = ["Thor", "Loki"]
    app = QApplication(sys.argv)
    MainWindow = QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    ui.SetList()
    MainWindow.show()
    
    sys.exit(app.exec_())

关键修改说明

  1. 将滚动区域的初始化逻辑移至setupUi,仅执行一次,避免重复创建控件。
  2. SetList函数先清空布局内的旧按钮,确保列表刷新时无残留控件。
  3. 移除for循环内重复设置scrollArea widget的冗余代码,仅在初始化时设置一次。
  4. 添加输入框清空逻辑,优化用户操作体验。

内容的提问来源于stack exchange,提问作者Yann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:09:56