python - PyQt 访问动态创建的 Label 和 LineEdit

标签 python pyqt pyqt5

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

我不知道这怎么可能?

例如,当单击开始按钮时,它应该更改 PS1 QLineEdit 的文本来自XXXXYYYY .

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

最佳答案

当前的设计使得访问小部件变得困难,因为您没有保存对元素的访问权限(您可以使用 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")

关于python - PyQt 访问动态创建的 Label 和 LineEdit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59079006/

相关文章:

python - 导入 pydrake.multibody.math 时出现导入错误

python - 多重继承元类冲突

qt - 根据内容的变化从 QWizardPage 动态添加/删除 Finish

python - 在没有互联网连接的计算机上安装 PyQt for Python3.9

python - Numpy/Python 与 Matlab 相比表现糟糕

c++ - Arduino SHA1-HMAC 和 base64 编码与 Python 之间的对话问题

python - 增加 QTextEdit 的下边距

python - PyQt5 连接在这种情况下不起作用 : item cannot be converted to PyQt5. QtCore.QObject

python - `pip install pyqt5` 和 `sudo apt-get install python3-pyqt5` 有什么区别? [这里 pyQt5 本身更像是一个占位符]

python - 在 ubuntu 上,如何在现有的 python3.6(或更新版本)安装旁边安装 python3.5?