找回密码
 会员注册
查看: 32|回复: 0

pythonPyQt5对象类型的判定,对象删除操作详细解读

[复制链接]

2

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2024-9-5 11:08:23 | 显示全部楼层 |阅读模式
✨✨欢迎大家来到景天科技苑✨✨🎈🎈养成好习惯,先赞后看哦~🎈🎈🏆作者简介:景天科技苑🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。🏆《博客》:Python全栈,前后端开发,小程序开发,云原生K8S,人工智能,js逆向,App逆向,网络系统安全,数据分析,PyQt5,tkinter,Django,fastapi,flask等框架,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:PyQt5桌面应用开发,零基础到进阶应用实战景天的主页:景天科技苑文章目录PyQt5类型判定类型判断演示PyQt5类型判断案例PyQt5删除对象删除对象案例PyQt5类型判定主要是用来判定一个对象的类型,或者说是否继承自某个类相关API和应用场景如下主要有两个方法isWidgetType()判断某个对象是都控件类型inherits()一个对象是否继承(直接或间接)自某个父类两方法返回值均为True或False类型判断演示遍历对象,判断对象所属类型和父类fromPyQt5.Qtimport*classWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle("QObject的学习")self.resize(500,500)self.setup_ui()defsetup_ui(self):self.QObject类型判定()defQObject类型判定(self):#*************API***************开始obj=QObject()w=QWidget()btn=QPushButton()label=QLabel()objs=[obj,w,btn,label]foroinobjs:print("是否是QWidget的控件类型",o.isWidgetType())print("父类是否是QWidget",o.inherits("QWidget"))print("父类是否是QPushButton",o.inherits("QPushButton"))print("------------------------------------------")#*************API***************结束if__name__=='__main__':importsysapp=QApplication(sys.argv)window=Window()window.show()sys.exit(app.exec_())12345678910111213141516171819202122232425262728293031323334353637运行。可以判定某个对象所属的类型PyQt5类型判断案例根据所属类型,设置指定的样式fromPyQt5.Qtimport*classWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle("QObject的学习")self.resize(500,500)self.setup_ui()defsetup_ui(self):self.QObject类型判定()defQObject类型判定(self):#*************API***************开始#obj=QObject()#w=QWidget()#btn=QPushButton()#label=QLabel()##objs=[obj,w,btn,label]#foroinobjs:#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)#循环遍历子对象#forwidgetinself.findChildren(QLabel):forwidgetinself.children():#print(widget)#ifwidget.isWidgetType():#将子对象中为QLabel的对象设置背景样式ifwidget.inherits("QLabel"):widget.setStyleSheet("background-color:cyan;")#*************案例***************结束if__name__=='__main__':importsysapp=QApplication(sys.argv)window=Window()window.show()sys.exit(app.exec_())1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465运行,QLabel颜色都发生了变化,btn的颜色不变,说明选定了QLabelPyQt5删除对象obj.deleteLater()删除一个对象时,也会解除它与父对象之间的关系。deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象。这样做的好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时。删除对象案例fromPyQt5.Qtimport*classWindow(QWidget):def__init__(self):super().__init__()self.setWindowTitle("QObject的学习")self.resize(500,500)self.setup_ui()defsetup_ui(self):self.QObject对象删除()defQObject对象删除(self)bj1=QObject()#为了防止局部变量运行完方法就销毁,将局部变量赋值给类变量self.obj1=obj1obj2=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被释放了"))#删除对象#delobj2#这样并不能删除obj2.deleteLater()print(obj1.children())#obj2并没有立马被释放print("obj2",obj2)#执行了deleteLater后,向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象,才会真正的去释放相关的对象if__name__=='__main__':importsysapp=QApplication(sys.argv)window=Window()window.show()sys.exit(app.exec_())123456789101112131415161718192021222324252627282930313233343536373839404142434445运行可以看到obj2并没有立马被删除,立马打印obj1的子对象和obj2还是能打印出来的过一段时间,obj2才被删除
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-7 06:15 , Processed in 0.514791 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表