根據設置的Name標示查找組件的對象,關鍵函數:setObjectName()/findChild()
findChild()/2:需要兩個參數,
參數一:組件的類型,如QLineEdit、QPushButton。
參數二:setObjectName()設置的Name標示。
個人注解:
背景描述:
目前屬於初級階段,各種了解都不太全面。
場景描述:
一個widget容器(視為parent)通過設置layout添加了很多組件,比如button,input,
通過設置parent.button_1,parent.input_2保存對象,容器中的組件多了很亂的,比如某個事件觸發了需要獲取多個input.text(),
現階段掌握的知識只能通過parent.input_1.text()、parent.input_2.text()、parent.input_3.text()獲取.
改進方案:
①、如果能建立各個組件的Name標示和組件的類型的映射關系,則可直接通過findChild(map_nameId_type,nameId)找到組件。
②、直接建立組件對象NameId和組件對象的映射,map(key-value),只占用widget的自定義子類的類型為dictionary一個屬性,
(在寫方案①的時候想到的,原始方案太挫了、、、、突然有點喜歡上python的弱類型,Java的強類型的思維模式習慣了)
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QHBoxLayout, QLineEdit) from PyQt5.QtGui import * from PyQt5.QtCore import * import sys def clickHandle(): #button = main.sender() #print(button.objectName()) array = [] array.append(QLineEdit) #根據名字獲取組件 obj = main.findChild(array[0],"edit_1") print(type(obj)) print(isinstance(obj, QLineEdit)) print(isinstance(obj, array[0])) print(main.findChild(array[0],"edit_1").text()) print(main.findChild(QLineEdit,"edit_1").text()) print(edit_1.text()) if __name__ == '__main__': app=QApplication(sys.argv) main=QWidget() latout = QHBoxLayout() main.setLayout(latout) but_1 = QPushButton('but_1') but_1.setObjectName('but_1') but_1.clicked.connect(clickHandle) but_2 = QPushButton('but_2') but_2.setObjectName('but_2') but_2.clicked.connect(clickHandle) edit_1 = QLineEdit() edit_1.setObjectName('edit_1') edit_2 = QLineEdit() edit_2.setObjectName('edit_2') latout.addWidget(but_1) latout.addWidget(but_2) latout.addWidget(edit_1) latout.addWidget(edit_2) main.show() app.exec_()
方案②、
from PyQt5.QtWidgets import (QApplication, QWidget, QPushButton, QHBoxLayout, QLineEdit) from PyQt5.QtGui import * from PyQt5.QtCore import * import sys def clickHandle(): #button = main.sender() #print(button.objectName()) array = [] array.append(QLineEdit) #根據名字獲取組件 obj = main.findChild(array[0],"edit_1") print(type(obj)) print(isinstance(obj, QLineEdit)) print(isinstance(obj, array[0])) print(main.findChild(array[0],"edit_1").text()) print(main.findChild(QLineEdit,"edit_1").text()) print(edit_1.text()) print(array_obj[2].text()) print(array_obj[3].text()) if __name__ == '__main__': app=QApplication(sys.argv) main=QWidget() array_obj = [] latout = QHBoxLayout() main.setLayout(latout) but_1 = QPushButton('but_1') but_1.setObjectName('but_1') but_1.clicked.connect(clickHandle) but_2 = QPushButton('but_2') but_2.setObjectName('but_2') but_2.clicked.connect(clickHandle) array_obj.append(but_1) array_obj.append(but_2) edit_1 = QLineEdit() edit_1.setObjectName('edit_1') edit_2 = QLineEdit() edit_2.setObjectName('edit_2') array_obj.append(edit_1) array_obj.append(edit_2) latout.addWidget(but_1) latout.addWidget(but_2) latout.addWidget(edit_1) latout.addWidget(edit_2) main.show() app.exec_()