1. parent()——父对象
示例:self.label1.parent()
返回:self.label1的父对象
2. children()——直接子对象
示例:self.children()
返回:列表形式,所有直接子对象(亲儿子这一层)
3. findChild()——满足条件的子对象
示例:self.findChild(QLabel, ‘标签2’).setText(‘修改标签2的内容’)
参数:参数1-对象类型,如QLabel、QPushButton等
参数2-对象名称(对象设置的ObjectName),可选,省略该参数则从所有类型中查找
参数3-在所有对象中查到或在直接子对象中查找,默认是所有对象查找。取值为 Qt.FindDirectChildOnly,Qt.FindDirectChildOnly
说明:即使有多个符合条件的子对象,也只返回一个
4. findChildren()——满足条件的所有子对象
同findChild(),区别是返回所有查找到的子对象
完整示例:
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
class MyWindow(QMainWindow):
def __init__(self):
super().__init__()
self.resize(400,400)
self.setWindowTitle('寻找子控件')
self.label1 = QLabel('标签1的内容')
self.label1.setObjectName('标签1')
self.label2 = QLabel('标签2的内容')
self.label2.setObjectName('标签2')
self.btn = QPushButton('修改标签2')
self.btn.clicked.connect(self.changeLabel2)
self.btn2 = QPushButton('删除第二条log')
self.btn2.clicked.connect(self.deleteLog2)
self.btn3 = QPushButton('修改所有标签')
self.btn3.clicked.connect(self.changeall)
self.log = QListWidget()
self.center = QWidget()
self.layout = QVBoxLayout(self.center)
self.layout.addWidget(self.label1)
self.layout.addWidget(self.label2)
self.layout.addWidget(self.btn)
self.layout.addWidget(self.btn2)
self.layout.addWidget(self.btn3)
self.layout.addWidget(self.log)
self.setCentralWidget(self.center)
# 寻找父子对象
print('标签1的父对象:', self.label1.parent()) # 父对象
print('子对象:', self.children()) # 所有直接子对象
self.seq = 0 # 计数器,记录点击的次数
def changeLabel2(self):
self.findChild(QLabel, '标签2').setText('修改标签2的内容') # 查找子对象
self.record = QLabel(f'第{self.seq}次点击按钮,修改标签2的内容')
self.record.setObjectName(f'点击第{self.seq}次')
self.record.setProperty('row', self.seq) # 设置伪属性
self.listitem = QListWidgetItem()
self.log.addItem(self.listitem)
self.log.setItemWidget(self.listitem, self.record)
self.seq += 1
def deleteLog2(self):
# item = self.log.findChild(QLabel, '第2次点击按钮,修改标签2的内容')
item = self.findChild(QLabel, '点击第2次')
item.setHidden(True) # 只是隐藏QLabel,list这一行的item还在
self.log.item(int(item.property('row'))).setHidden(True)
item1 = self.log.item(10)
self.log.scrollToItem(item1, QAbstractItemView.PositionAtTop)
def changeall(self):
lb_list = self.findChildren(QLabel) # 查找子对象
for lb in lb_list:
lb.setText('修改了该标签的内容')
self.record = QLabel(f'第{self.seq}次点击按钮,修改所有标签的内容')
self.record.setObjectName(f'点击第{self.seq}次')
self.record.setProperty('row', self.seq) # 设置伪属性
self.listitem = QListWidgetItem()
self.log.addItem(self.listitem)
self.log.setItemWidget(self.listitem, self.record)
self.seq += 1
if __name__ == '__main__':
app = QApplication(sys.argv)
myMain = MyWindow()
myMain.show()
sys.exit(app.exec_())