标签:
根据设置的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_()
pyqt的setObjectName()/findChild()
标签:
原文地址:http://www.cnblogs.com/ribavnu/p/4674095.html