【python】PyQt5对象类型的判定,对象删除操作详细解读

CSDN 2024-07-05 15:05:16 阅读 52

在这里插入图片描述

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

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

🏆 作者简介:景天科技苑

🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。

🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战

景天的主页:景天科技苑

文章目录

PyQt5类型判定类型判断演示PyQt5类型判断案例

PyQt5删除对象删除对象案例

PyQt5类型判定

主要是用来判定一个对象的类型,或者说是否继承自某个类

相关API和应用场景如下

主要有两个方法

isWidgetType() 判断某个对象是都控件类型inherits() 一个对象是否继承(直接或间接)自某个父类

两方法返回值均为True或False

在这里插入图片描述

类型判断演示

遍历对象,判断对象所属类型和父类

<code>from PyQt5.Qt import *

class Window(QWidget):

def __init__(self):

super().__init__()

self.setWindowTitle("QObject的学习")

self.resize(500, 500)

self.setup_ui()

def setup_ui(self):

self.QObject类型判定()

def QObject类型判定(self):

# *************API***************开始

obj = QObject()

w = QWidget()

btn = QPushButton()

label = QLabel()

objs = [obj, w, btn, label]

for o in objs:

print("是否是QWidget的控件类型",o.isWidgetType())

print("父类是否是QWidget",o.inherits("QWidget"))

print("父类是否是QPushButton",o.inherits("QPushButton"))

print("------------------------------------------")

# *************API***************结束

if __name__ == '__main__':

import sys

app = QApplication(sys.argv)

window = Window()

window.show()

sys.exit(app.exec_())

运行。可以判定某个对象所属的类型

在这里插入图片描述

PyQt5类型判断案例

根据所属类型, 设置指定的样式

<code>from PyQt5.Qt import *

class Window(QWidget):

def __init__(self):

super().__init__()

self.setWindowTitle("QObject的学习")

self.resize(500, 500)

self.setup_ui()

def setup_ui(self):

self.QObject类型判定()

def QObject类型判定(self):

# *************API***************开始

# obj = QObject()

# w = QWidget()

# btn = QPushButton()

# label = QLabel()

#

# objs = [obj, w, btn, label]

# for o in objs:

# print("是否是QWidget的控件类型",o.isWidgetType())

# print("父类是否是QWidget",o.inherits("QWidget"))

# print("父类是否是QPushButton",o.inherits("QPushButton"))

# print("------------------------------------------")

# *************API***************结束

# *************案例***************开始

label1 = QLabel(self)

label1.setText("景天科技苑")

label1.move(100, 100)

label2 = QLabel(self)

label2.setText("科技不间断")

label2.move(150, 150)

btn = QPushButton(self)

btn.setText("点我")

btn.move(200, 200)

#循环遍历子对象

# for widget in self.findChildren(QLabel):

for widget in self.children():

# print(widget)

# if widget.isWidgetType():

#将子对象中为QLabel的对象设置背景样式

if widget.inherits("QLabel"):

widget.setStyleSheet("background-color: cyan;")

# *************案例***************结束

if __name__ == '__main__':

import sys

app = QApplication(sys.argv)

window = Window()

window.show()

sys.exit(app.exec_())

运行,QLabel颜色都发生了变化,btn的颜色不变,说明选定了QLabel

在这里插入图片描述

PyQt5删除对象

obj.deleteLater()

删除一个对象时, 也会解除它与父对象之间的关系。

deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象。

这样做的好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时。

在这里插入图片描述

删除对象案例

<code>from PyQt5.Qt import *

class Window(QWidget):

def __init__(self):

super().__init__()

self.setWindowTitle("QObject的学习")

self.resize(500, 500)

self.setup_ui()

def setup_ui(self):

self.QObject对象删除()

def QObject对象删除(self):

obj1 = QObject()

#为了防止局部变量运行完方法就销毁,将局部变量赋值给类变量

self.obj1 = obj1

obj2 = QObject()

obj3 = QObject()

obj3.setParent(obj2)

obj2.setParent(obj1)

#创建信号与槽

obj1.destroyed.connect(lambda : print("obj1被释放了"))

obj2.destroyed.connect(lambda : print("obj2被释放了"))

obj3.destroyed.connect(lambda : print("obj3被释放了"))

#删除对象

# del obj2 #这样并不能删除

obj2.deleteLater()

print(obj1.children())

#obj2并没有立马被释放

print("obj2",obj2)

#执行了deleteLater后,向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象,才会真正的去释放相关的对象

if __name__ == '__main__':

import sys

app = QApplication(sys.argv)

window = Window()

window.show()

sys.exit(app.exec_())

运行

可以看到obj2并没有立马被删除,立马打印obj1的子对象和obj2还是能打印出来的

过一段时间,obj2才被删除

在这里插入图片描述



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。