PyQt访问动态创建的Label和LineEdit

问题描述 投票:0回答:1

我正在尝试访问动态创建的Label和LineEdit来更改其文本。

我不知道怎么可能?

例如,单击开始按钮时,应将PS1 QLineEdit的文本从XXXX更改为YYYY

from PyQt5 import QtCore, QtGui, QtWidgets


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("BiPolar Power Supply Testing")
        widget_map = {}

        tab_widget = QtWidgets.QTabWidget()
        self.setCentralWidget(tab_widget)

        pstest_widget = QtWidgets.QWidget()
        tab_widget.addTab(pstest_widget, "PS Tests")

        pstest_vlay = QtWidgets.QVBoxLayout()        

        for i in range(1, 9):
            title = "PS{}".format(i)
            group_box = MainWindow.create_pstest_element(title)
            pstest_vlay.addWidget(group_box)

        self.PSFStart_btn = QtWidgets.QPushButton("Start")
        self.PSFStop_btn = QtWidgets.QPushButton("Stop")
        pstest_vlay.addWidget(self.PSFStart_btn)
        pstest_vlay.addWidget(self.PSFStop_btn)
        pstest_vlay.addStretch()

        grid_lay_1 = QtWidgets.QGridLayout(pstest_widget)
        #grid_lay_1.addWidget(pstest_widget)
        grid_lay_1.addLayout(pstest_vlay, 0, 0)

    @staticmethod
    def create_pstest_element(title):
        group_box = QtWidgets.QGroupBox(title)
        grid = QtWidgets.QGridLayout()        

        serial_label = QtWidgets.QLabel("Serial No:")
        serial_lineedit = QtWidgets.QLineEdit("XXXX")

        grid.addWidget(serial_label, 0, 0)
        grid.addWidget(serial_lineedit, 0, 1)

        group_box.setLayout(grid)
        return group_box

if __name__ == "__main__":
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()   
    w.show()
    sys.exit(app.exec_())

这是GUI的外观:

GUI Screenshot

python pyqt pyqt5
1个回答
0
投票

当前的设计使访问小部件变得很困难,因为您没有保存对元素的访问权限(可以使用使用findChildren的过滤器,但该方法不具有可伸缩性或雅致性。)>]

在这些情况下,比通过创建内部元素(例如QLabel和QLineEdit类成员)来创建从QGroupBox继承的类更好。另一方面,有许多QGroupBox,最好使用一个容器,该容器允许我们通过索引或键访问每个元素,在这个容器中,列表就足够了。

class GroupBox(QtWidgets.QGroupBox):
    def __init__(self, title, parent=None):
        super().__init__(title, parent)
        grid = QtWidgets.QGridLayout()

        self.serial_label = QtWidgets.QLabel("Serial No:")
        self.serial_lineedit = QtWidgets.QLineEdit("XXXX")

        grid.addWidget(self.serial_label, 0, 0)
        grid.addWidget(self.serial_lineedit, 0, 1)

        self.setLayout(grid)


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("BiPolar Power Supply Testing")

        tab_widget = QtWidgets.QTabWidget()
        self.setCentralWidget(tab_widget)

        pstest_widget = QtWidgets.QWidget()
        tab_widget.addTab(pstest_widget, "PS Tests")

        pstest_vlay = QtWidgets.QVBoxLayout()

        self.group_boxes = []

        for i in range(1, 9):
            title = "PS{}".format(i)
            group_box = GroupBox(title)
            pstest_vlay.addWidget(group_box)
            self.group_boxes.append(group_box)

        self.PSFStart_btn = QtWidgets.QPushButton("Start")
        self.PSFStop_btn = QtWidgets.QPushButton("Stop")
        pstest_vlay.addWidget(self.PSFStart_btn)
        pstest_vlay.addWidget(self.PSFStop_btn)
        pstest_vlay.addStretch()

        grid_lay_1 = QtWidgets.QGridLayout(pstest_widget)
        # grid_lay_1.addWidget(pstest_widget)
        grid_lay_1.addLayout(pstest_vlay, 0, 0)

        self.PSFStart_btn.clicked.connect(self.on_start_clicked)

    @QtCore.pyqtSlot()
    def on_start_clicked(self):
        group_box = self.group_boxes[0]
        group_box.serial_lineedit.setText("YYYY")
© www.soinside.com 2019 - 2024. All rights reserved.