【python】PyQt5各个控件语法解析,QObject父子对象的操作

news2024/11/16 0:04:43

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战
景天的主页:景天科技苑

文章目录

  • PyQt5控件
    • PyQt5 的控件类型
  • QObject类
    • QObject的对象名称和属性
    • QObject对象的父子关系操作

PyQt5控件

在PyQt5界面设计中,显示控件扮演着至关重要的角色。它们不仅负责向用户展示信息、图像、或其他多媒体内容,而且在很大程度上决定了应用程序的用户体验和交互效果。
通过精心设计和使用这些控件,可以创建出直观、易于操作且视觉上吸引人的界面。

控件也称控件对象,是 Qt用户界面上最基本的组件类型,也是构成用户界面的基本结构。
用户界面上显示的所有内容都是控件,例如按钮、标签、文本框,又如菜单栏、工具栏、状态栏,甚至整个窗口本身也是控件。

PyQt5 的控件类型

在这里插入图片描述

这些控件类型,总体上可以分类如下:

输入控件:

按钮:QPushButton(按键按钮),QToolButton(工具按钮),QRadioButton(单选框),QCheckButton(多选框),QCommandLinkButton(连接命令的按钮)
键盘输入控件:QlineEdit(单行输入),QTextEdit(多行输入),QPlainTextEdit(普通多行输入),QkeySequenceEdit(快捷键输入)
调节输入控件:QAbstractSpinBox(步长调节输入),QDateEdit(日期输入),QTimeEdit(时间输入),QDateTimeEdit(日期和时间输入)
数字调节框控件:QSpinBox(整型数字调节框),QDoubleSpinBox(浮点数字调节框)
滑动输入控件:QDial(旋转拖滑输入),QSlider(直线拖动输入),QScrollBar(滚动条),QRubberBand(橡皮筋拖拽)
下拉输入控件:QComboBox(组合框下拉选项),QSlider(直线拖动输入),QScrollBar(滚动条),QRubberBand(橡皮筋拖拽)
对话框输入控件:QDialog(对话框),QColorDialog(颜色对话框),QFileDialog(文件对话框),QFontDialog(字体对话框),QInputDialog(输入对话框)
日历控件:QCalendarWidget(日期选择部件)

展示控件:

内容显示控件:QLabel(显示框),QLCDNumber(液晶显示器),QProgressBar(进度条)
对话框显示控件:QMessageBox(信息提示框),QErrorMessage(错误提示框),QProgressDialog(进度提示框)

高级控件:

容器控件:QToolBox,QDialogButtonBox,QGroupBox,QMdiSubWindow
结构控件:QMainWindow,QTabwidget,QStackedWidget,QSplitter,QDockWidget
滚动控件:QTextBrowser,QScrollArea,QAbstractItemView,QMdiarea,QGraphicsView
辅助控件:QFocusFrame,QSizeGrip,QDesktopWidget
其它控件

这么多控件,有些相同的共性,有些不同的共性
在这里插入图片描述

这些类具有一定的继承关系
在这里插入图片描述

QObject 类是 PyQt5 的基类,也是所有控件的父类。
所有的 Qt 控件都是 QObject 类的子类,因此都继承了 QObject 类的特性,可以接收用户的输入事件,如鼠标和键盘输入,并可以在用户界面上显示控件内容,还可以存放其它控件。

要了解 QObject 类的子类,可以使用 “__subclasses__()” 将所有的子类打印出来。

from PyQt5.Qt import *
print(QObject.__subclasses__())

在这里插入图片描述

我们主要研究GUI有关的类,QWidget这个类
在这里插入图片描述

我们看下QWidget具备的子类
在这里插入图片描述

#递归列出某个类的子类

def getSubClasses(cls):

    for subcls in cls.__subclasses__():
        print(subcls)
        if len(cls.__subclasses__()) > 0:
            getSubClasses(subcls)

getSubClasses(QAbstractButton)

在这里插入图片描述

QObject类

在这里插入图片描述

查看QObject的父类,以及调用顺序

def QObject继承结构测试(self):
    # QObject.__subclasses__()
    #通过mro来查看某个类的父类
    mros = QObject.mro()
    for mro in mros:
        print(mro)

在这里插入图片描述

QObject的对象名称和属性

在这里插入图片描述

PyQt5中,一般将样式放在单独的qss文件中,注意:文件后缀一般设为qss
看到,样式表中只匹配QLabel标签,其他控件没有设置
QObject.qss文件

QLabel#notice {
    font-size: 20px;
    color: gray;
    border: 1px solid gray;
    border-radius: 8px;
}
QLabel#notice[notice_level="normal"] {
    color: green;
    border-color: green;
}
QLabel#notice[notice_level="warning"] {
    color: yellow;
    border-color: yellow;
}
QLabel#notice[notice_level="error"] {
    color: red;
    border-color: red;
}

在这里插入图片描述

def QObject对象名称和属性的操作(self):

    # *************测试API***************开始
    # obj = QObject()
    # #设置属性名
    # obj.setObjectName("notice")
    # #获取属性名
    # print(obj.objectName())
    # #设置属性名,属性值
    # obj.setProperty("notice_level", "error")
    # obj.setProperty("notice_level2", "warning")
    # #获取属性值
    # print(obj.property("notice_level"))
    # #获取一个对象中所有通过setProperty()设置的属性名称
    # print(obj.dynamicPropertyNames())
    # **************测试API**************结束

    # *************案例演示***************开始
    #读取样式表,开发过程中,将qss文件单独放到一个文件中
    with open("QObject.qss", "r") as f:
        #使用qApp这个全局变量给程序设置样式,读取qss文件
        qApp.setStyleSheet(f.read())

    label = QLabel(self)
    #设置属性名
    label.setObjectName("notice")
    #设置属性名和属性值
    label.setProperty("notice_level", "warning")
    label.setText("景天科技苑")

    label2 = QLabel(self)
    label2.move(100, 100)
    label2.setObjectName("notice")
    label2.setProperty("notice_level", "error")
    label2.setText("科技不间断")

    label3 = QLabel(self)
    label3.setText("xxxx")
    label3.move(150, 150)

    #按钮在样式表中未匹配到,所以没有样式
    btn = QPushButton(self)
    btn.setObjectName("notice")
    btn.setText("btn")
    btn.move(50, 50)

    #设置控件的样式
    # label.setStyleSheet("font-size: 20px; color: red;")

    # *************案例演示***************结束

运行发现,设置了notice属性的标签,都被设置了样式
未设置notice属性,或者不属于标签的控件,未被设置样式
在这里插入图片描述

QObject对象的父子关系操作

QObject能让两个对象产生父子关系
在这里插入图片描述
在这里插入图片描述

父子对象的应用场景
在这里插入图片描述
在这里插入图片描述

def QObject对象的父子关系操作(self):
    # *************测试API***************开始
    obj0 = QObject()
    obj1 = QObject()
    obj2 = QObject()
    obj3 = QObject()
    obj4 = QObject()
    obj5 = QObject()
    print("obj0", obj0)
    print("obj1", obj1)
    print("obj2", obj2)
    print("obj3", obj3)
    print("obj4", obj4)
    print("obj5", obj5)
    #设置obj0为obj1和obj2的父对象
    #setParent里面的参数是父对象
    obj1.setParent(obj0)
    obj2.setParent(obj0)
    #设置obj2的属性名为 2
    obj2.setObjectName("2")

    # 只能同类型才能设置父对象,其他类型设置报错
    #label = QLabel()
    #label.setParent(obj0)
    #print("obj0的子对象",obj0.findChildren((QObject,QLabel)))


    # 一个对象,只能设置一个父对象,设置多了,后面的会把前面的覆盖
    obj1.setParent(obj2)
    print("obj1的父对象是: ",obj1.parent())



    # 将obj3的父对象设置为obj1
    obj3.setParent(obj1)
    obj3.setObjectName("3")

    #obj4和obj5的父对象设置为obj2
    obj4.setParent(obj2)
    obj5.setParent(obj2)

    #打印obj1的父对象
    print(obj1.parent())

    #打印obj0的子对象,只包含直系子对象
    print("obj0的子对象",obj0.children())

    #查找子对象
    '''
    findChild 第一个参数是类型或类型元祖,第二个参数是名称,就是setObjectName设置的,第三个参数是查找选项,默认敌对查找 Qt.FindChildrenRecursively
    Qt.FindDirectChildrenOnly 只查找直接子对象
    '''
    #只查找一个
    print("查找一个子对象",obj0.findChild(QObject,'2'))

    #查找多个
    print("查找多个子对象",obj0.findChildren(QObject))

    # *************测试API***************结束


    # *************内存管理机制***************开始
    obj1 = QObject()
    #将obj1设为类的一个属性,运行完不会被释放
    self.obj1 = obj1
    obj2 = QObject()
    #obj2设为obj1的子控件
    obj2.setParent(obj1)

    # 删除obj1后,监听obj2对象被释放
    #destroyed信号,连接一个槽
    obj2.destroyed.connect(lambda : print("obj2对象被释放了"))

    #删除obj1对象
    del self.obj1
    # *************内存管理机制***************结束

运行
在这里插入图片描述

设置父对象,也不是随便类型的都能设置,不同类型的设置父子对象会报错
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1861049.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python文本挖掘数据分析——竞争分析(1)

文章目录 前言项目背景与目标品类分布分析数据准备与处理查看数据类目作图查看占比的不同 适用对象作图查看适用对象占比 产品结构分析对商品分类汇总定义作图函数拜耳安速科凌虫控 前言 数据说明: 项目背景与目标 该项目旨在分析三个品牌(拜耳、安速、科凌虫控&…

从删库到还原

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 从删库到还原 魔法一魔法二魔法三魔法四查看是否开启binlog,且format为row执行以下命…

常微分方程算法之编程示例四(龙格-库塔法)

目录 一、算例一 1.1 研究问题 1.2 C代码 1.3 计算结果 二、算例二 2.1 研究问题 2.2 C代码 2.3 计算结果 一、算例一 本节我们采用龙格-库塔法(Runge-Kutta法)求解算例。 龙格-库塔法的原理及推导请参考: 常微分方程算法之龙…

钡铼BL101网关6串口Modbus转MQTT优化智慧园区设备互联

BL101网关:优化智慧园区设备互联的关键利器 在当今快速发展的智能化时代,智慧园区管理对于设备之间的高效互联至关重要。钡铼(BL101)网关作为一款功能强大的Modbus转MQTT设备,不仅支持多种通信协议和硬件接口&#xf…

安帝康生物完成超2亿元A轮融资,持续深耕呼吸感染和疼痛领域创新药研发

日前,嘉兴安帝康生物科技有限公司(下称“安帝康生物”)正式宣布完成超2亿元A轮融资,由先声药业(02096.HK)、华金投资与华金大道联合领投,老股东同创伟业、嘉兴新创创投持续加投,嘉睿…

【CVPR2024】Bootstrapping Autonomous Radars with Self-Supervised Learning

原文链接:https://arxiv.org/abs/2312.04519 简介:自动驾驶中的雷达可以在极端天气下进行感知,但相关模型的训练受到标注困难的阻碍。本文提出自监督框架,利用大量无标注雷达数据预训练雷达表达。方法包括雷达到雷达的、以及雷达到…

适用于不同场合的高频俄语祝福语,柯桥零基础俄语培训

Приятного аппетита. Кушайте на здоровье. (говорят те, кто подает еду на стол, обычно это хозяйка дома, квартиры, или официант в кафе, ресторане…

论文辅导 | 基于贝叶斯优化LSTM的锂电池健康状态评估方法

辅导文章 模型描述 在传统的 LSTM 神经网络中,超参数的取值对模型性能有很大影响,但人工调参很难得到最优解。 因此,本文加入了 BO 来迭代出最优超参数。 在利用LSTM 神经网络评估锂电池 SoH 的基础上,通过 BO来提高评估的精确度。 预测效果

`THREE.PointsMaterial` 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。

demo案例 THREE.PointsMaterial 是 Three.js 中用于创建粒子系统材质的类。它允许你设置粒子系统的外观属性,比如颜色、大小和透明度。下面是对其构造函数的参数、属性和方法的详细讲解。 构造函数 const material new THREE.PointsMaterial(parameters);参数&am…

sourceTree 和Tortoise git软件的对比,以及使用sourceTree管理公司托管的 gitlab 项目或github项目

文章目录 Tortoisegit 和sourcetree的比较如何添加 gitlab 的社区版账号总结参考资料 Tortoisegit 和sourcetree的比较 我在 window都是用 Git 小乌龟(Tortoise git)来可视化管理 Git 项目。这时是不区分 Git 平台的,也就是不管你用的是 Git…

第4讲:pixi.js绘制舞台、随窗口大小而改变画布大小和舞台位置

基于前面写的代码,在gamelets的工程目录下新建一个CanvasAndStage.ts 代码如下 import {Application, Graphics} from pixi.js; // 不要忘了,一定要引用这个css样式,否则就会以默认样式显示 import ./style.css // app.view就是画布&#xf…

宝塔面板部署前端项目

部署前端项目 1 打包自己的项目2 登录宝塔面板3 添加站点4 设置域名5 进入当前站点对应的文件目录中6 上传打包后的文件7 访问网站 1 打包自己的项目 2 登录宝塔面板 点击左侧“网站”菜单进入对应页面 点击“添加站点” 3 添加站点 填写域名,如果没有域名的&am…

公交行业系统特点及面临的挑战

在当前城市发展中,公交行业作为公共交通的重要组成部分,承担着重要的社会责任。随着科技的进步和城市化进程的加快,公交行业系统也在不断地发展和完善。然而,从目前的发展情况来看,公交行业系统也呈现出一些显著的特点…

jmeter乱码汇总

一、Web页面乱码 如果想让他显示中文可以按以下操作: 1、打开jmter配置文件 bin/jmeter.properties 2、修改配置文件,查找“sampleresult.default.encoding”将其改为utf8,注意要去掉“#”号 sampleresult.default.encodingutf-8 3、重启 jmeter 4、再次…

让TSN DDS运转起来——面向智能汽车的以太网测试解决方案

概述 作为OPEN联盟和AUTOSAR联盟的核心成员,经纬恒润多年来持续为国内外各大OEM和供应商提供车载以太网相关的咨询服务,涵盖TCP/IP、SOME/IP、DDS、诊断、TSN等前沿技术领域的设计和测试。同时,经纬恒润与行业内的合作伙伴紧密合作&#xff0…

Linux删除文件磁盘空间未释放解决办法

工作中经常遇到Linux系统磁盘空间不足,但是删除后较大的日志文件后,发现磁盘空间仍没有被释放。 解决思路 1、工作发现磁盘空间不足; 2、找到占用磁盘空间较大的文件进行删除; 3、删除文件后,查看磁盘空间使用情况…

Web Serial串口通信实现WEB浏览器读写M1卡

本示例使用的设备&#xff1a;RS232串口RFID NFC IC卡读写器可二次开发编程发卡器USB转COM-淘宝网 (taobao.com) <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> &l…

第10章 启动过程组 (启动过程组的重点工作)

第10章 启动过程组 10.3启动过程组的重点工作&#xff0c;在第三版教材第362~364页&#xff1b; 文字图片音频方式 第一个知识点&#xff1a;项目启动会议 1、作用 标志着对项目经理责权的定义结果的正式公布&#xff0c;通常由项目经理负责组织和召开。2、目的 使项目各…

AI网络爬虫:下载m3u8视频文件

要下载m3u8视频文件&#xff0c;首先得找到m3u8地址&#xff0c;按下F12键&#xff0c;看网络-fetch/xhr,然后找网址中包括m3u8的地址&#xff0c;再预览或者看下相应 https://1304688195.vod2.myqcloud.com/9d058fb7vodtranscq1304688195/1194c6da1253642699220090018/video_1…

【阅读论文】-- IDmvis:面向1型糖尿病治疗决策支持的时序事件序列可视化

IDMVis: Temporal Event Sequence Visualization for Type 1 Diabetes Treatment Decision Support 摘要1 引言2 1 型糖尿病的背景3 相关工作3.1 时间事件序列可视化3.2 电子健康记录可视化3.3 1 型糖尿病可视化3.4 任务分析与抽象 4 数据抽象5 层次化任务抽象5.1 临床医生工作…