【PyQt】PyQt学习(二)模块介绍+QObject学习

news2024/12/23 12:48:37

简介

PyQt API 是一组包含大量类和函数的模块。核心模块如下:

  • QtGui:包含了窗口系统、事件处理(QEvent)、2D 图像(QImage)、基本绘画、字体(QFont)和文字类;
  • QtCore:包含所有的核心非 GUI 类;
  • QtWidgets:包含一系列创建桌面应用的 UI 元素,所有的 GUI 元素都在这个模块中;
  • QtMultimedia:包含了处理多媒体的内容和调用摄像头 API 的类,所有的低级多媒体类倒在这个模块;
  • QtNetwork:网络编程类;
  • QtOpenGL:OpenGL 支持类;
  • QtPositioning:包含了定位的类,可以使用卫星、WiFi 甚至文本;
  • QtWebEngine:Qt 集成了 Web 浏览器;
  • QtSql:包含整个 SQL 处理的类;
  • QtXml:包含了处理 xml 的类,提供了 SAX 和 DOM API 的工具;
  • QtSvg:包含显示 SVG 文件内容的类;

PyQt 库的核心就是 QtGui、QtCore 和 QtWidgets 三个模块,他们基本包含了 GUI 创建和逻辑处理所需的全部类,也是我们学习 PyQt 的核心。

PyQt5不兼容 PyQt4。PyQt5有一些巨大的改进:

  • 重新组合模块,一些模块已经被废弃(QtScript),有些被分为两个子模块(QtGui, QtWebKit);
  • 添加了新的模块,比如 QtBluetooth, QtPositioning,和 Enginio;
  • 废弃了 SINGAL()和 SLOT()的调用方式,使用了新的信号和 xx 处理方式;
  • 不再支持被标记为废弃的或不建议使用的 API;

信号与槽机制

在正式介绍 PyQt 的各个控件之前,先介绍一下 Qt 框架的信号与槽机制。信号与槽(Signal/Slots)是 Qt 编程的基础,也是 Qt 框架的一大特色。因为有了信号与槽机制的存在,在 Qt 中处理界面组件的交互操作时变得比较直观和简单。

信号(Signal)就是在特定情况下被发射(emit)的一种告示,例如 PushButton 按钮最常见的信号就是鼠标点击的时候发射的 clicked () 信号;一个 ComboBox 最常见的信号是选择的项目发生变化的时候发射的 CurrentIndexChanged () 信号。GUI 程序设计的主要内容就是对界面上各个组件发射的特定信号进行响应,只需要知道哪一个控件在什么情况下发射了哪些信号,然后合理地去响应这些信号即可。

槽(Slot)就是对信号响应的函数。槽的本质是一个函数,他可以直接被调用,这个和普通的函数没有什么不同,槽函数与普通函数不同的一点是:槽函数可以与一个信号关联,当信号被发射的时候,关联的槽函数会自动被执行。Qt 的类一般都有一些内建(build-in)的槽函数,例如 QWidget 有一个槽函数 close(),其功能是关闭窗口,如果一个信号与之关联,当信号发射的时候就会关闭窗口。

信号与槽是一个非常复杂的机制,其底层就是 Qt 的事件机制,我将会在后面的博文中详细说明。

QObject

当我们打开 Qt-Designer 的时候,可以看到最顶层的 QObject 属性设置,具体如下图所示:

在这里插入图片描述

QObject 是所有对象的父对象,它定义了一个 QObject 是 Qt 对象模型的核心。这个模型的中心特性是一个非常强大的对象通信机制,称为信号和插槽。QObject 以对象树的形式组织自身。当创建 QObject 并将另一个对象作为父对象时,该对象将自动将其自身添加到父对象的子对象列表中,父对象取得子对象的所有权。QObject 在 Qt 中还提供了基本的定时器支持,高级定时器功能由 QTimer 进行实现。

重要方法和属性

设置控件的属性

  • setObjectName():设置控件的唯一标识符;
  • objectName():获取控件的名称;
  • setProperty():设置控件的一个属性;
  • property():获取控件的属性;
  • dynamicPropertyNames():动态的获取使用 setProperty() 方法设置的属性名称。

设置父子关系

  • setParent():设置父对象。
  • parent():获取父对象。
  • children():获取所有的子对象。
  • findchildren():查找改对象的所有子对象(可以指定查找的对象类型,还可以指定是查找直接还是所有子对象)

进行类型判断:

  • isWidgetType():判定是否是一个控件类型。
  • inherits():判定一个对象时候直接/间接继承了指定的父类。

对象删除:

  • deleteLater():向主消息队列发送一个事件,下一次收到该事件的时候再进行清除。(删除对象的时候会删除任何父子关系)

定时器

  • startTimer():开启一个定时器。
  • killTimer():删除定时器。
  • timerEvent():定时器执行的事件。

信号

  1. ObjectNameChanged:对象名称发生改变的时候发出此信号。
  2. destory:对象销毁的时候发出此信号。
  3. blockSignals:对象临时屏蔽一个信号。

应用场景

  1. 用于 QSS 的 ID 选择器,方便统一设置格式;
  2. 控件内存管理
    1. 所有得到对象都可以在一个父对象中进行自我组织;
    2. 内存管理变得容易,当一个父对象被销毁,它的所有子对象也都被销毁了;
  3. 一个空间是否能够作为顶级窗口存在依赖于它是否有父控件,如果没有父控件那么它将作为顶级窗口存在;
  4. 简单定时器实现;
  5. 控件类型判断;

示例

下面的示例创建了三个 QObject 对象,并进行了如下演示:

  1. 设置 objectname 属性;
  2. 设置父子关系;
  3. 设置 property 属性;
# 定义三个QObject对象  
widget1 = QObject()  
widget2 = QObject()  
widget3 = QObject()  
  
# 设置三个控件的objectname并打印  
widget1.setObjectName("widget1")  
widget2.setObjectName("widget2")  
widget3.setObjectName("widget3")  
  
print(widget1.objectName()) -> widget1  
print(widget2.objectName()) -> widget2    
print(widget3.objectName()) -> widget3    
  
  
# 设置父子关系并打印  
# 只能显示直接子对象,不能显示间接子对象
widget3.setParent(widget2)  
widget2.setParent(widget1)  
  
print(widget1.children()) -> [<PyQt5.QtCore.QObject object at 0x0000026BC638D5E0>]  
print(widget2.children()) -> [<PyQt5.QtCore.QObject object at 0x0000026BC638D790>]  
print(widget1.children()[0].objectName()) -> widget2  
print(widget2.children()[0].objectName()) -> widget3

# 设置property并打印
# 如果没有设置相应属性则返回None
widget1.setProperty("value", 1)
widget2.setProperty("value", 2)  
widget3.setProperty("value", 3)  
  
print(widget1.property('value')) ->  1  
print(widget2.property('value')) ->  2  
print(widget3.property('value')) ->  3  
print(widget1.property('path')) ->  None

下面的示例演示了 QObject 提供的定时器功能,一个 QObject 对象设置定时器,当定时器设定时间截止之后会自动调用对象的timerEvent方法(事件机制的一部分),示例源码如下:

# 定时器示例  
class MainWindow(QMainWindow):  
    def __init__(self):  
        super(MainWindow, self).__init__()  
        # 计数器,看timerEvent的调用次数
        self.counter = 0  
        # 设置一个1000毫秒的定时器
        self.startTimer(1000, Qt.TimerType.PreciseTimer)  

	# 重写timerEvent方法
    def timerEvent(self, event) -> None:  
        self.counter += 1  
	    print(f"timerEvent第{self.counter}次调用")  
        if self.counter == 5:  
	        print("调用结束,关闭窗口")
		    self.close()
  
  
if __name__ == '__main__':  
    import sys  
  
    app = QApplication(sys.argv)  
    win = MainWindow()  
    win.show()  
    sys.exit(app.exec())

运行结果如下:

在这里插入图片描述

往期回顾

  1. 【PyQt】PyQt学习(一)框架介绍+环境搭建

文中难免会出现一些描述不当之处(尽管我已反复检查多次),欢迎在留言区指正,相关的知识点也可进行分享,希望大家都能有所收获!!

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

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

相关文章

02.13:监督学习中的分类问题

今天首先学习了监督学习中的分类问题&#xff0c;跑了两个代码。现在学起来感觉机器学习有很多不同的定理建立了不同的分类器&#xff0c;也就是所谓不同的方法。具体的数学原理我不太清楚。然后不同的应用场景有一个最优的分类器。 值得一提的应该就是终于清晰的明白了精度&am…

IDEA 中使用 Git 图文教程详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

记录一次time_wait与close_wait的检查

框架与语言&#xff1a;php tp6swoole 原因&#xff1a;每隔几天就会出现,redis:Cannot assign requested address 开始想法&#xff0c;谷歌、百度。然后结果都是配置系统参数。比如下面例子 vi /etc/sysctl.confvm.overcommit_memory 1 net.core.somaxconn 6024 net.ip…

记录--数组去重的五种方法

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言 您或许会疑惑&#xff0c;网上那么多去重方法&#xff0c;这篇文章还有什么意义&#xff1f; 别着急&#xff0c;这篇文章只节选了简单的&#xff0c;好玩的&#xff0c;古老的&#xff0c;有实际…

内网渗透(二十四)之Windows协议认证和密码抓取-Mimikatz读取sam和lsass获取密码

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

ILSSI国际研讨会将为您呈现六西格玛技术的未来与前景

ILSSI 欢迎世界各地的精益六西格玛专业人士参加即将举行的2023年国际精益六西格玛研讨会&#xff0c;这次研讨会将邀请到世界各地的专家学者&#xff0c;分享他们的专业知识和经验&#xff0c;并就精益六西格玛等相关议题进行探讨和交流。 这是一个绝佳的机会&#xff0c;让您…

Hudi-集成Flink

文章目录集成Flink环境准备sql-client方式启动sql-client插入数据查询数据更新数据流式插入code 方式环境准备代码类型映射核心参数设置去重参数并发参数压缩参数文件大小Hadoop参数内存优化读取方式流读&#xff08;Streaming Query&#xff09;增量读取&#xff08;Increment…

MongoDB简介入门docker安装MongDB,Spring集成MongDB

一、MongoDB简介1、NoSQL简介NoSQL(NoSQL Not Only SQL)&#xff0c;意即反SQL运动&#xff0c;指的是非关系型的数据库&#xff0c;是一项全新的数据库革命性运动&#xff0c;早期就有人提出&#xff0c;发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储…

【C++初阶】十一、STL---priority_queue(总)

目录 一、priority_queue介绍 二、priority_queue使用 三、仿函数 四、priority_queue模拟实现 4.1 版本1 4.2 版本2 一、priority_queue介绍 priority_queue文档介绍 翻译; &#xff08;1&#xff09;优先队列是一种容器适配器&#xff0c;根据严格的弱排序标准&#x…

微服务网关(五)grpc代理模块

微服务网关&#xff08;五&#xff09;grpc代理模块 GRPC是谷歌出品的一个高性能、开源、通用的RPC框架&#xff0c;基于HTTP/2标准设计&#xff0c;支持普通RPC也支持双向流式传递&#xff0c;相对于thrift连接&#xff0c;它可以多路复用&#xff0c;可传递header头数据 在…

Ubuntu20.04 安装Azure Kinect Sensor

本文主要记录Ubuntu20.04 安装Azure Kinect Sensor SDKAzure Kinect 人体跟踪 SDK官网&#xff1a;https://learn.microsoft.com/zh-cn/azure/Kinect-dk/body-sdk-downloadLinux版本目前只支持18.04和20.04Azure Kinect 传感器 SDK 官网&#xff1a;https://learn.microsoft.co…

ubuntu20.04下配置深度学习环境GPU

卸载子系统 C:\Users\thzn>wsl --list 适用于 Linux 的 Windows 子系统分发版: docker-desktop (默认) docker-desktop-data Ubuntu-18.04 Ubuntu-22.04 Ubuntu-20.04 C:\Users\thzn>wsl --unregister Ubuntu-18.04 ubuntu 换源 https://www.cnblogs.com/Horizon-asd/p…

【编程基础之Python】4、安装Python开发工具

【编程基础之Python】4、安装Python开发工具安装Python开发工具为什么需要开发工具Anaconda自带的开发工具PyCharm安装PyCharm运行PyCharm并创建项目总结安装Python开发工具 为什么需要开发工具 通常情况下&#xff0c;为了提高开发效率&#xff0c;需要使用相应的开发工具&a…

Three.js 无限平面快速教程【Plane】

Three.js 提供了 Plane 概念来表示在 3d 空间中无限延伸的二维表面。 这对于光标交互很有用&#xff0c;因此你可能需要了解如何设置此平面、将其可视化并根据需要进行调整。 推荐&#xff1a;使用 NSDT场景设计器 快速搭建 3D场景。 Three.js 的 Plane 文档很好而且准确&…

Locust初次体验【解决webUI没数据】

官方文档&#xff1a;What is Locust? — Locust 2.14.2 documentation webUI模式跑起来没有数据。。。。&#xff1f;&#xff1f;&#xff1f;&#xff1b; E:\T_Work\other\WB_Locust\my_locustfiles>locust [2023-02-14 09:57:44,530] PC-20190108TSZQ/INFO/locust.m…

Java 基础面试题——基本数据类型与包装类

目录1.Java 有哪几种基本数据类型&#xff1f;分别对应哪些包装类&#xff1f;2.Java 中为什么要保留基本数据类型&#xff1f;为什么要使用包装类&#xff1f;3.基本数据类型的转换规则有哪些&#xff1f;4.基本数据类型与包装类有什么区别&#xff1f;5.什么是装箱&#xff1…

MongoDB--》索引的了解及具体操作

目录 索引—index 索引的类型 索引的管理操作 索引的使用 索引—index 使用索引的原因&#xff1a;索引支持在MongoDB中高效地执行查询。如果没有索引&#xff0c;MongoDB必须执行全集合扫描&#xff0c;即扫描集合中的每个文档&#xff0c;以选择与查询语句匹配的文档。这…

基于android的即时通讯APP 聊天APP

基于android的即时通讯APP 或者 聊天APP 一 项目概述 该项目是基于Android 的聊天APP系统&#xff0c;该APP包含前台&#xff0c;后台管理系统&#xff0c;前台包含用户通讯录,用户详情&#xff0c;用户聊天服务&#xff0c;用户二维码,发现功能,发现详情 , 个人中心, 个人信…

【RSTP的原理和配置】

一、RSTP 概述 RSTP使用了IEEE 802.1W协议&#xff0c;视为STP的改进版本&#xff0c;收敛速度快&#xff0c;兼容STP。 RSTP可以兼容STP&#xff0c;但是会丧失快速收敛等优势&#xff1b; 1、RSTP对STP的改进&#xff1b; 1.1、端口角色的增补、简化了生成树协议的理解及部…

【基于transform和CNN的多级蒸馏:超分】

A hybrid of transformer and CNN for efficient single image super-resolution via multi-level distillation &#xff08;基于transform和CNN的多级蒸馏单幅图像超分辨率算法&#xff09; 近年来&#xff0c;基于卷积神经网络&#xff08;CNN&#xff09;的单幅图像超分辨…