簡體   English   中英

PyQt訪問動態創建的Label和LineEdit

[英]PyQt accessing Label and LineEdit that are dynamically created

我正在嘗試訪問動態創建的Labels和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屏幕截圖

當前的設計使訪問小部件變得很困難,因為您沒有保存對元素的訪問權限(可以使用使用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")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM