当前位置: 首页 > news >正文

【PyQt学习篇 · ②】:QObject - 神奇的对象管理工具

文章目录

  • QObject介绍
  • Object的继承结构测试
  • QObject对象名称和属性
    • QObject对象名称和属性的操作
    • 应用场景
  • QObject父子对象
    • QObject父子对象的操作
  • QObject的信号与槽
    • QObject的信号与槽的操作

QObject介绍

在PyQt中,QObject是Qt框架的核心对象之一。QObject是一个基类,它提供了对象之间的信号和槽机制、父子对象关系管理、对象属性以及事件处理等功能。

以下是QObject类的一些常用特性和功能:

  1. 信号和槽机制:QObject支持信号和槽机制,用于实现对象之间的通信。通过定义信号和槽,可以在事件发生时触发、连接和处理功能。信号可以在特定条件下被发射,而槽则是处理信号的函数。

  2. 父子对象关系:QObject支持父子对象关系的管理。可以使用setParent()方法将一个QObject对象设置为另一个QObject对象的父对象。当父对象被销毁时,它会负责销毁其所有的子对象。

  3. 对象属性:QObject支持动态属性机制,可以通过setProperty()方法设置对象的属性值,并可以通过property()方法获取属性值。属性可以用于存储对象的状态或其他自定义信息。

  4. 事件处理:QObject提供了处理事件的基本机制。可以通过重写event()eventFilter()方法来处理对象接收到的事件。事件可以是鼠标事件、键盘事件或其他自定义事件。

  5. 对象生命周期管理:QObject对象在创建后可以自动管理其生命周期。在Python中,当一个QObject对象没有引用时,它会被Python的垃圾回收器销毁。同时,QObject的父子关系机制也可以在父对象销毁时自动销毁子对象。

QObject是PyQt中其他重要对象(如QWidget、QThread等)的基类,它为它们提供了共享的核心功能和特性。

下面,将从以下基本程序展开演示QObject的具体使用方法:

class Window(QWidget):def __init__(self):super().__init__()self.setWindowTitle("QLabel的学习")self.resize(500, 500)self.setup_ui()# 调用以下文章自定义的函数def setup_ui(self):passif __name__ == '__main__':app = QApplication(sys.argv)window = Window()window.show()sys.exit(app.exec_())

注意:

  • 在以上代码中,self代表当前实例化的Window对象。在Python中,通过使用self关键字,可以在类的方法中引用对象自身。

  • 在构造函数中的super().__init__()调用中,self被用于传递当前对象自身给父类的构造函数,确保父类的初始化操作能够正确地处理当前对象。

Object的继承结构测试

如以下代码所示,在Window()类中自定义一个QObject_Inheritance_Structure_Testing(self)方法,在该方法中,通过调用QObject.mro()方法,可以获取到QObject类的方法解析顺序。方法解析顺序决定了当一个方法被调用时,解释器在哪个类中找到该方法的定义。通过打印每个继承类,可以查看继承结构中各个类的排列顺序。

    # QObject继承结构测试def QObject_Inheritance_Structure_Testing(self):mros  = QObject.mro()for mro in mros:print(mro)

运行结果:

在这里插入图片描述
这些打印结果表示了QObject类的继承关系。QObject类继承自sip.wrapper类,sip.wrapper类又继承自sip.simplewrapper类,最后都继承自object类。继承结构定义了这些类之间的层次关系,使得QObject类可以具有基类和扩展类提供的功能和属性。

QObject对象名称和属性

在进行QObject对象的名称和属性操作时,可以使用以下 API:

  1. setObjectName(name): 设置对象的名称,可以用于在后续代码中查找和识别具体的对象。一般这个名称是唯一的,当做对象的ID来使用。
  2. objectName(): 获取对象的名称。
  3. setProperty(name, value): 设置对象的属性,可以用于存储和传递自定义的数据。
  4. property(name): 获取对象的属性值。
  5. dynamicPropertyNames(): 获取对象所有动态属性的名称列表。

QObject对象名称和属性的操作

以下将对演示如何使用这些API:

	# QObject对象名称和属性def Operation_of_QObject_object_names_and_attributes(self):# QObject的对象操作obj = QObject()obj.setObjectName("notice")     # 设置对象的名称print(obj.objectName())     # 打印对象的名称# QObject的属性操作obj.setProperty("notice_level", "error")    # 设置了notice_level属性,其值为error,同等于notice_level="error"obj.setProperty("notice_level2", "warning")print(obj.property("notice_level2"))     # 打印notice_level2属性的值print(obj.dynamicPropertyNames())   # 获取对象obj的所有动态属性名称列表并打印

运行结果:

在这里插入图片描述

应用场景

在本篇文章中,QObject对象名称和属性的主要演示的应用场景:用于qss的ID选择器,属性选择器,方便统一设置样式。

设置qss样式方法一:使用setStyleSheet()方法。

        label = QLabel(self)label.setText("Hello world")# 设置qss样式label.setStyleSheet("font-size: 20px; color: red;")

运行结果:

在这里插入图片描述
通过设置qss样式,将字体的大小变为20px,颜色变为红色。

设置qss样式方法二

  • 创建一个QObject.qss文件,在文件内写入对应的qss样式
QLabel#notice {font-size: 20px;color: red;
}QLabel#notice[notice_level="warning"] {font-size: 30px;color: yellow;
}

在以上qss样式中,notice为对象的名称,notice_levelwarning为对象的属性及其值。

  • 编写使用该样式的程序
        with open("QObject.qss", "r") as f:qApp.setStyleSheet(f.read())    # 读取整个字符串并赋值给app全局变量label = QLabel(self)label.setText("Hellow world")label.setObjectName("notice")  # 设置对象名称,即IDlabel2 = QLabel(self)label2.move(100, 100)label2.setText("PyQt5")label2.setObjectName("notice")  # 设置对象名称,即IDlabel2.setProperty('notice_level', 'warning')   # 设置对象的属性及其值btn = QPushButton(self)btn.setText("我是按钮")btn.move(50, 50)

在以上代码中,打开名为QObject.qss的样式表文件,读取其中的内容,并将其应用于应用程序全局变量qApp。因为样式表文件中只设置了QLabel的样式,所以只会匹配QLabel对象,并根据对象的名称和属性匹配其样式。

运行结果:
在这里插入图片描述

QObject父子对象

在PyQt中,可以使用以下API来操作QObject的父子对象:

  1. setParent(parent): 将当前对象设置为指定父对象的子对象。当父对象被销毁时,所有的子对象也会被自动销毁。
  2. parent(): 返回当前对象的父对象。
  3. children(): 返回当前对象的直接子对象列表。
  4. findChild( type, objectName): 在当前对象的子对象中查找指定名称和类型的对象。如果找到,则返回该对象;否则返回 None。
  5. findChildren(type): 在当前对象的子对象中查找指定类型的所有对象并返回一个列表。

其中,findChildfindChildren方法是一些方便的查找子对象的API。findChild方法需要传入待查找对象的名称和类型作为参数;而findChildren方法只需要传入待查找对象的类型即可。这两个方法都只会查找当前对象的直接子对象,不会递归查找其子孙对象。

QObject父子对象的操作

尝试构造以下父子关系:

在这里插入图片描述

    # QObject父子对象的操作def QObject_Parent_Child_Object(self):# 创建五个QObject对象obj0 = QObject()obj1 = QObject()obj2 = QObject()obj3 = QObject()obj4 = QObject()obj5 = QObject()print('obj0', obj0)     # 打印obj0对象的地址print('obj1', obj1)print('obj2', obj2)print('obj3', obj3)print('obj4', obj4)print('obj5', obj5, '\n')obj1.setParent(obj0)    # 设置obj1的父对象为obj0obj2.setParent(obj0)    # 设置obj2的父对象为obj0print('obj0 children: ', obj0.children(), '\n')   # 查看obj0的直接子对象列表print('未修改父对象前,父对象:', obj2.parent())      # 未修改父对象前obj2.setParent(obj1)print('修改父对象后,父对象:', obj2.parent(), '\n')      # 修改父对象后print('obj0 children: ', obj0.children())  # 修改obj2的父对象后,查看obj0的直接子对象列表obj3.setParent(obj1)    # 设置obj3的父对象为obj1obj4.setParent(obj2)    # 设置obj4的父对象为obj2obj5.setParent(obj2)    # 设置obj5的父对象为obj2

在以上代码中,设置了两次obj2的父对象,第一次设置的父对象为obj0,第二次设置的父对象为obj1。

运行结果:

在这里插入图片描述
从运行结果可看出,一个对象,它的父对象只能有一个,且以最后设置的父对象为主。

再观察以下代码,学习findChild(objectName, type)findChildren(type)的使用:

    # QObject父子对象的操作def QObject_Parent_Child_Object(self):# 创建五个QObject对象obj0 = QObject()obj1 = QObject()obj2 = QObject()obj3 = QObject()obj4 = QObject()obj5 = QObject()print('obj0', obj0)     # 打印obj0对象的地址print('obj1', obj1)print('obj2', obj2)print('obj3', obj3)print('obj4', obj4)print('obj5', obj5, '\n')obj1.setParent(obj0)    # 设置obj1的父对象为obj0obj2.setParent(obj0)    # 设置obj2的父对象为obj0obj2.setObjectName("2")     # 设置obj2对象的名称为2obj3.setParent(obj1)    # 设置obj3的父对象为obj1obj4.setParent(obj2)    # 设置obj4的父对象为obj2obj5.setParent(obj2)    # 设置obj5的父对象为obj2print(obj0.findChild(QObject))  # 返回第一个子对象,即返回obj1的地址print(obj0.findChild(QObject, "2"))     # 获取obj0的QObject类型且对象名称为2的子对象print(obj0.findChild(QObject, "3"))     # 获取obj0的QObject类型且对象名称为3的子对象,没有时返回Noneprint(obj0.findChildren(QObject))   # 获取obj0的所有QObject类型的子对象

运行结果:

在这里插入图片描述

QObject的信号与槽

在PyQt中,信号与槽(Signals and Slots)是一种用于实现对象间通信的机制。信号是由发送者发出的消息,而槽是接收信号并对其做出响应的方法。以下是PyQt中常用的信号与槽相关的API:

  1. 信号(Signal)相关的API:

    • pyqtSignal(): 创建一个自定义信号。
    • emit(): 发出信号,即调用信号对象的emit()方法。
  2. 槽(Slot)相关的API:

    • @pyqtSlot(): 将一个方法声明为槽函数。
    • connect(): 连接一个信号与一个槽函数。
    • disconnect(): 断开一个信号与一个槽函数的连接。
    • sender(): 返回发出信号的对象。
    • blockSignals(bool): 暂时阻塞或取消阻塞信号。
    • receivers(sign):返回连接到信号的接收器数量
  3. 信号与槽的连接相关的API:

    • QMetaObject.connectSlotsByName(self, obj): 通过对象的命名约定自动连接信号与槽函数。

QObject的信号与槽的操作

# QObject的信号与槽
def Signal_and_slot_of_QObject(self):self.obj = QObject()def destroy_slot(obj):print('对象被释放了', obj)def obj_name_slot(name):print('对象名称发生了改变', name)self.obj.objectNameChanged.connect(obj_name_slot)   # 建立与obj_name_slot槽函数的连接self.obj.destroyed.connect(destroy_slot)   # 建立与destroy_slot槽函数的连接self.obj.setObjectName('xxx')self.obj.objectNameChanged.disconnect()     # 取消连接self.obj.setObjectName('yyy')self.obj.objectNameChanged.connect(obj_name_slot)   # 再次建立与槽函数的连接self.obj.setObjectName('xxyy')self.obj.blockSignals(True)     # 临时阻断连接self.obj.setObjectName('111')self.obj.blockSignals(False)    # 重新连接self.obj.setObjectName('222')print(self.obj.receivers(self.obj.objectNameChanged))   # 获取objectNameChanged信号绑定的槽函数数量del self.obj

运行结果:

在这里插入图片描述

相关文章:

【PyQt学习篇 · ②】:QObject - 神奇的对象管理工具

文章目录 QObject介绍Object的继承结构测试QObject对象名称和属性QObject对象名称和属性的操作应用场景 QObject父子对象QObject父子对象的操作 QObject的信号与槽QObject的信号与槽的操作 QObject介绍 在PyQt中,QObject是Qt框架的核心对象之一。QObject是一个基类…...

【AcWing】1.1.3二分搜索

一、二分搜索 1、查找数的范围 原题链接  这道题看似是二分搜索的题目,实则就是二分搜索。与一般的搜索不同的是,若查找元素重复,则分别返回重复元素的左端下标和右端下标,若不存在则返回“-1 -1。我们常用的二分搜索是返回的…...

【Python第三方包】串口通信(pySerial包)

文章目录 前言一、串口的基本使用1.1 配置串口基本信息1.2 读取串口数据1.3 写串口1.4 关闭串口二、示例代码2.1 示例1: 从串口读取数据2.2 示例2: 向串口写入数据总结前言 串口通信是许多嵌入式和物联网应用中的关键组成部分。Python 提供了许多第三方库来简化串口通信的实现…...

VS Code2023安装教程(最新最详细教程)附网盘资源

目录 一.简介 二.安装步骤 三.VS Code 使用技巧 网盘资源见文末 一.简介 VS Code是一个由微软开发的跨平台的轻量级集成开发环境(IDE),被广泛用于编写各种编程语言的代码。它支持多种编程语言,并且可以通过插件扩展功能。 以…...

最优值函数

一、最优状态值函数 解决强化学习任务大致上意味着找到一种政策,能够在长期内实现很多奖励。对于有限MDPs,我们可以精确地定义一种最优政策,其定义如下。值函数定义了政策的一种部分排序。如果一个政策的预期回报大于或等于另一个政策π0在所…...

软考系统架构师知识点集锦十:计算机网络、数学与经济管理、知识产权与标准化

一、计算机网络 1.1、考情分析 2.1 TCP/IP协议簇 2.1.1常见协议及功能 网际层是整个TCP/IP体系结构的关键部分,其功能是使主机可以把分组发往任何网络并使分组独立地传向目标。 POP3: 110 端口,邮件收取SMTP: 25 端口,邮件发送FTP: 20数据端口/21控制…...

风云七剑攻略,最强阵容搭配

今天的风云七剑攻略最强阵容搭配给大家推荐以神仙斋减怒回血为主的阵容。 关注【娱乐天梯】,获取内部福利号 首先,这个角色在这个阵容当中,所有的角色当中,他的输出系数是最高的,已经达到了200%的层次,而且…...

关于ABB 机器人多任务的建立

关于ABB 机器人多任务的建立.需要实时监控某一区域,或者某一信号,或者计件到达某一数量机器人自动停止报警,显示到示教器上,多任务可以实现,类似发那科机器人后台逻辑指令 当软件选项漏选或者少选可以选择修改选项&…...

【计算机网络笔记】传输层——多路复用和多路分用

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...

【PC】特殊空投-2023年10月

亲爱的玩家朋友们,大家好! 10月特殊空投活动来袭。本月我们也准备了超多活动等着大家来体验。快来完成任务获得丰富的奖励吧!签到活动,每周一次的PUBG空投节,还有可以领取PGC2023免费投票劵的活动等着大家!…...

Android Studio 下载地址

一、Android Studio 下载地址及版本说明 1.Android 开发者官网:(1)Android Developers (全球,需科学上网) (2)https://developer.android.google.cn/index.html (国内&a…...

General error: 2006 MySQL server has gone away thinkphp6.0 报这个错误怎么修改

"General error: 2006 MySQL server has gone away" 错误表示 MySQL 服务器连接已断开或超时,导致无法继续进行数据库操作。 在 ThinkPHP 6.0 中,您可以通过以下方法来解决这个问题: 调整 MySQL 服务器的超时设置:您可…...

08 _ 栈:如何实现浏览器的前进和后退功能?

浏览器的前进、后退功能,我想你肯定很熟悉吧? 当你依次访问完一串页面a-b-c之后,点击浏览器的后退按钮,就可以查看之前浏览过的页面b和a。当你后退到页面a,点击前进按钮,就可以重新查看页面b和c。但是,如果你后退到页面b后,点击了新的页面d,那就无法再通过前进、后退…...

【T】分治与倍增

分治,分而治之,其中最经典的便是二分 一、二分 一种经典而且非常好用的思想 将原问题对半转换成两个问题,子问题又继续转换成两个问题,许多子问题会很显然对答案没有关系,所以能讲原本O(n)的东西转化为O(logn) 但一般…...

后门分析及示例

代码分析,关键字定位 传一个asp文件 输入账户错误会提示:非法登录; 逆向工程抓取这个关键字定位 查找代码里面的关键字,定位到关键字后把代码复制出来, 修改exec执行函数为msgbox消息弹出用gb2312方式保存成VBS文件.…...

Vue 的双向数据绑定是如何实现的?

目录 1. 响应式数据 2. v-model 指令 3. 实现原理 4. 总结 Vue.js 是一款流行的前端 JavaScript 框架,它以其强大的双向数据绑定能力而闻名。双向数据绑定使得数据在视图和模型之间保持同步,并且任一方的变化都会自动反映到另一方。那么,…...

Android环境变量macOS环境变量配置

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览macOS基础知识 三、设置环境变量3.1 终…...

设计模式(全23种)

1.前言 1.CUML类图 面向对象设计主要就是使用UML的类图,类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。下面基于C这门语…...

腾讯云轻量应用服务器“月流量”不够用怎么办?

腾讯云轻量应用服务器“月流量”不够用怎么办?超额部分支付流量费,价格为0.8元/GB。腾讯云轻量服务器月流量什么意思?月流量是指轻量服务器限制每月流量的意思,不能肆无忌惮地使用公网,流量超额需要另外支付流量费&…...

【esp32]VSCode-SPI控制OLED

根据Adafruit_GFX第三方库&#xff0c;其drawPixel方法由子类实现 代码&#xff1a;在OLED实现函数功能 先声明类 SPI库和Adafruit库、SSD1306 #include <Arduino.h> #include <SPI.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> …...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...