PyQt5点击pushbutton在运行时向scrollArea动态添加QLabel的问题
问题说明
你要实现点击按钮在QScrollArea中动态新增QLabel的需求,现有代码存在两个核心错误:
- 调用
QScrollArea.setWidget()会直接替换滚动区域的根承载控件,所以每次点击都会覆盖原有内容,而非新增 - 未将新创建的QLabel添加到滚动区域内容控件已有的垂直布局中,新建的标签无法在原有内容基础上追加展示
修复方案
你已经在scrollArea的内容控件scrollAreaWidgetContents上绑定了垂直布局verticalLayout,只需要将每次新增的QLabel添加到该布局中即可,修改add_new_label方法如下:
def add_new_label(self): new_label = QtWidgets.QLabel() new_label.setText("HelloWorld") # 追加到已有垂直布局末尾 self.verticalLayout.addWidget(new_label) # 若需要后续操作这些新增标签,可初始化列表存储实例 # if not hasattr(self, "added_labels"): # self.added_labels = [] # self.added_labels.append(new_label)
完整可运行修改后代码
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'test.ui' # # Created by: PyQt5 UI code generator 5.9.2 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.scrollArea = QtWidgets.QScrollArea(self.centralwidget) self.scrollArea.setGeometry(QtCore.QRect(130, 80, 221, 301)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scrollArea.sizePolicy().hasHeightForWidth()) self.scrollArea.setSizePolicy(sizePolicy) self.scrollArea.setWidgetResizable(True) self.scrollArea.setObjectName("scrollArea") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 219, 299)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.verticalLayout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) self.verticalLayout.setObjectName("verticalLayout") self.label = QtWidgets.QLabel(self.scrollAreaWidgetContents) self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) self.label_2 = QtWidgets.QLabel(self.scrollAreaWidgetContents) self.label_2.setObjectName("label_2") self.verticalLayout.addWidget(self.label_2) self.label_3 = QtWidgets.QLabel(self.scrollAreaWidgetContents) self.label_3.setObjectName("label_3") self.verticalLayout.addWidget(self.label_3) self.label_4 = QtWidgets.QLabel(self.scrollAreaWidgetContents) self.label_4.setObjectName("label_4") self.verticalLayout.addWidget(self.label_4) self.scrollArea.setWidget(self.scrollAreaWidgetContents) self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(390, 110, 89, 25)) self.pushButton.setObjectName("pushButton") self.pushButton.clicked.connect(self.button_pressed) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "TextLabel")) self.label_2.setText(_translate("MainWindow", "TextLabel")) self.label_3.setText(_translate("MainWindow", "TextLabel")) self.label_4.setText(_translate("MainWindow", "TextLabel")) self.pushButton.setText(_translate("MainWindow", "PushButton")) def button_pressed(self): print("button pressed") self.add_new_label() def add_new_label(self): new_label = QtWidgets.QLabel() new_label.setText("HelloWorld") self.verticalLayout.addWidget(new_label) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())
内容的提问来源于stack exchange,提问作者Mohsin Ali
相关产品推荐
相关产品推荐

