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

06-29 1382阅读

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

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

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

🏆 作者简介:景天科技苑

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

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

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

景天的主页:景天科技苑

文章目录

  • PyQt5类型判定
    • 类型判断演示
    • PyQt5类型判断案例
    • PyQt5删除对象
      • 删除对象案例

        PyQt5类型判定

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

        相关API和应用场景如下

        主要有两个方法

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

          两方法返回值均为True或False

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

          类型判断演示

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

          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_())
          

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

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

          PyQt5类型判断案例

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

          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

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

          PyQt5删除对象

          obj.deleteLater()

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

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

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

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

          删除对象案例

          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才被删除

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

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]