PyQt5——findChild

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_())
  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值