根据设置的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()的更多相关文章

  1. Pyqt+QRcode 生成 识别 二维码

    1.生成二维码 python生成二维码是件很简单的事,使用第三方库Python QRCode就可生成二维码,我用Pyqt给QRcode打个壳 一.python-qrcode介绍 python-qrco ...

  2. Pyqt 屏幕截图工具

    从Pyqt的examples中看到一段截图代码, (路径:examplas\desktop\screenshot.py) 所以想自己UI下界面,手动练习下 通过UI生成的: Screenshot.py ...

  3. Pyqt Smtplib实现Qthread多线程发送邮件

    一. smtplib 的介绍 smtplib.SMTP([host[, port[, local_hostname[, timeout]]]])   SMTP类构造函数,表示与SMTP服务器之间的连接 ...

  4. Pyqt QSystemTrayIcon 实现托盘效果

    pyqt的托盘效果很好实现,在Pyqt的demo中有个例子 路径:PyQt4\examples\desktop\systray.py 今天我就仿这个Tray效果做效果 一. 创建UI trayicon ...

  5. Pyqt 音视频播放器

    在寻找如何使用Pyqt做一个播放器时首先找到的是openCV2 openCV2 貌似太强大了,各种关于图像处理的事情它都能完成,如 读取摄像头.图像识别.人脸识别.  图像灰度处理 . 播放视频等,强 ...

  6. Pyqt 打开外部链接的几种方法

    Pyqt 触发一个事件,打开外部链接,我找到了这个方法,供大家参考 1. QDesktopServices 的openUrl 方法 QtGui.QDesktopServices.openUrl(QtC ...

  7. Pyqt QListWidget 展示系统环境变量

    今天学习了下Pyqt的 QListWidget 控件 我们先看下这个图片 这张图片就是典型的listWidget效果,我们今天就仿这样布局新建个ListWidget 在网上找了个关于QListWidg ...

  8. Pyqt 中__init__(self,parent==None) parent理解

    参考: 在PyQt中,所有class都是从QObject派生而来,QWidget对象就可以有一个parent.这种parent-child关系主要用于两个方面: 没有parent的QWidget类被认 ...

  9. Pyqt 打包资源文件

    用打包工具将做好的Pyqt程序打包成exe后发现引用的资源图片都显示不了? 是否遇到了和我一样的问题呢.google之后找到了方法,一种方法是在程序中引用外部资源,另外一种方法是将资源文件转换为py文 ...

随机推荐

  1. 深入浅出 妙用Javascript中apply、call、bind【转】

    网上文章虽多,大多复制粘贴,且晦涩难懂,我希望能够通过这篇文章,能够清晰的提升对apply.call.bind的认识,并且列出一些它们的妙用加深记忆. apply.call 在 javascript ...

  2. centos 6.5 文件目录管理

    Linux不存在像Windows那样分盘符的概念,Linux在安装之后就以文件目录的形式来进行管理,存储.即当我们安装完系统之后,我们就会看到有一堆的目录出现在根目录下.同时Linux使用正斜杠“/” ...

  3. 不停mysql服务添加从库的两种方式

    现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...

  4. Spring mvc中DispatcherServlet详解

    简介 DispatcherServlet是前端控制器设计模式的实现,提供SpringWebMVC的集中访问点,而且负责职责的分派,而且与spring IOC容器无缝集成,从而可以获得Spring的优势 ...

  5. Perl的新特性开启

    1.perl自从5.8开始,新特性需要开启才可以使用,默认只是5.8版本,而不管当前你使用的是那个版本. 2.开启新特性,当然最高可用版本是你实际安装的版本,假设你安装的是v5.26版 ; #或者这样 ...

  6. linux perf and tracer ,java Flame Graph

    http://www.brendangregg.com/flamegraphs.html http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/rev/e826 ...

  7. 常用的正则表达式C#工具类

    Regex类实现了一些特殊功能数据检查,正则表达式的一些常用的功能,集成至该类中. public class RegexDao { private RegexDao() { } private sta ...

  8. python引用,浅拷贝,深拷贝

    1.引用 传递的是引用,原始列表改变,被赋值列表会同样改变,因为他们指向的是同一个地址. alist = [1,2,3,["a","b"]] blist = a ...

  9. flask celery 使用方法

    一.安装 由于celery4.0不支持window,如果在window上安装celery4.0将会出现下面的错误flask_clery 你现在只能安装pip install celery==3.1 二 ...

  10. Ubuntu下安装JDK1.7

    Ubuntu操作系统下如何手动安装JDK1.7呢?本文是我经历的全过程. Ubuntu版本:12.04 LTS JDK版本:1.7.0_04 安装目录:/usr/local/development/j ...