翼度科技»论坛 编程开发 python 查看内容

Python PyQt5对象类型的判定对象删除操作详细介绍

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9


PyQt5类型判定

主要是用来判定一个对象的类型,或者说是否继承自某个类
相关API和应用场景如下
主要有两个方法

  • isWidgetType() 判断某个对象是都控件类型
  • inherits() 一个对象是否继承(直接或间接)自某个父类
两方法返回值均为True或False


类型判断演示

遍历对象,判断对象所属类型和父类
  1. from PyQt5.Qt import *
  2. class Window(QWidget):
  3.     def __init__(self):
  4.         super().__init__()
  5.         self.setWindowTitle("QObject的学习")
  6.         self.resize(500, 500)
  7.         self.setup_ui()
  8.     def setup_ui(self):
  9.         self.QObject类型判定()
  10.     def QObject类型判定(self):
  11.         # *************API***************开始
  12.         obj = QObject()
  13.         w = QWidget()
  14.         btn = QPushButton()
  15.         label = QLabel()
  16.         objs = [obj, w, btn, label]
  17.         for o in objs:
  18.             print("是否是QWidget的控件类型",o.isWidgetType())
  19.             print("父类是否是QWidget",o.inherits("QWidget"))
  20.             print("父类是否是QPushButton",o.inherits("QPushButton"))
  21.             print("------------------------------------------")
  22.         # *************API***************结束
  23. if __name__ == '__main__':
  24.     import sys
  25.     app = QApplication(sys.argv)
  26.     window = Window()
  27.     window.show()
  28.     sys.exit(app.exec_())
复制代码
运行。可以判定某个对象所属的类型


PyQt5类型判断案例

根据所属类型, 设置指定的样式
  1. from PyQt5.Qt import *
  2. class Window(QWidget):
  3.     def __init__(self):
  4.         super().__init__()
  5.         self.setWindowTitle("QObject的学习")
  6.         self.resize(500, 500)
  7.         self.setup_ui()
  8.     def setup_ui(self):
  9.         self.QObject类型判定()
  10.     def QObject类型判定(self):
  11.         # *************API***************开始
  12.         # obj = QObject()
  13.         # w = QWidget()
  14.         # btn = QPushButton()
  15.         # label = QLabel()
  16.         #
  17.         # objs = [obj, w, btn, label]
  18.         # for o in objs:
  19.         #     print("是否是QWidget的控件类型",o.isWidgetType())
  20.         #     print("父类是否是QWidget",o.inherits("QWidget"))
  21.         #     print("父类是否是QPushButton",o.inherits("QPushButton"))
  22.         #     print("------------------------------------------")
  23.         # *************API***************结束
  24.         # *************案例***************开始
  25.         label1 = QLabel(self)
  26.         label1.setText("景天科技苑")
  27.         label1.move(100, 100)
  28.         label2 = QLabel(self)
  29.         label2.setText("科技不间断")
  30.         label2.move(150, 150)
  31.         btn = QPushButton(self)
  32.         btn.setText("点我")
  33.         btn.move(200, 200)
  34.         #循环遍历子对象
  35.         # for widget in self.findChildren(QLabel):
  36.         for widget in self.children():
  37.             # print(widget)
  38.             # if widget.isWidgetType():
  39.             #将子对象中为QLabel的对象设置背景样式
  40.             if widget.inherits("QLabel"):
  41.                 widget.setStyleSheet("background-color: cyan;")
  42.         # *************案例***************结束
  43. if __name__ == '__main__':
  44.     import sys
  45.     app = QApplication(sys.argv)
  46.     window = Window()
  47.     window.show()
  48.     sys.exit(app.exec_())
复制代码
运行,QLabel颜色都发生了变化,btn的颜色不变,说明选定了QLabel


PyQt5删除对象

obj.deleteLater()
删除一个对象时, 也会解除它与父对象之间的关系。
deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象。
这样做的好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时。


删除对象案例
  1. from PyQt5.Qt import *
  2. class Window(QWidget):
  3.     def __init__(self):
  4.         super().__init__()
  5.         self.setWindowTitle("QObject的学习")
  6.         self.resize(500, 500)
  7.         self.setup_ui()
  8.     def setup_ui(self):
  9.         self.QObject对象删除()
  10.     def QObject对象删除(self):
  11.         obj1 = QObject()
  12.         #为了防止局部变量运行完方法就销毁,将局部变量赋值给类变量
  13.         self.obj1 = obj1
  14.         obj2 = QObject()
  15.         obj3 = QObject()
  16.         obj3.setParent(obj2)
  17.         obj2.setParent(obj1)
  18.         #创建信号与槽
  19.         obj1.destroyed.connect(lambda : print("obj1被释放了"))
  20.         obj2.destroyed.connect(lambda : print("obj2被释放了"))
  21.         obj3.destroyed.connect(lambda : print("obj3被释放了"))
  22.         #删除对象
  23.         # del obj2  #这样并不能删除
  24.         obj2.deleteLater()
  25.         print(obj1.children())
  26.         #obj2并没有立马被释放
  27.         print("obj2",obj2)
  28.         #执行了deleteLater后,向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象,才会真正的去释放相关的对象
  29. if __name__ == '__main__':
  30.     import sys
  31.     app = QApplication(sys.argv)
  32.     window = Window()
  33.     window.show()
  34.     sys.exit(app.exec_())
复制代码
运行
可以看到obj2并没有立马被删除,立马打印obj1的子对象和obj2还是能打印出来的
过一段时间,obj2才被删除

到此这篇关于PyQt5对象类型的判定,对象删除操作详细解读的文章就介绍到这了,更多相关PyQt5对象类型判定内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/python/323453rnb.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具