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_())
关键修改说明
- 将滚动区域的初始化逻辑移至
setupUi,仅执行一次,避免重复创建控件。 SetList函数先清空布局内的旧按钮,确保列表刷新时无残留控件。- 移除for循环内重复设置scrollArea widget的冗余代码,仅在初始化时设置一次。
- 添加输入框清空逻辑,优化用户操作体验。
内容的提问来源于stack exchange,提问作者Yann
相关产品推荐
相关产品推荐

