PyQt5类型判定
主要是用来判定一个对象的类型,或者说是否继承自某个类
相关API和应用场景如下
主要有两个方法
- isWidgetType() 判断某个对象是都控件类型
- inherits() 一个对象是否继承(直接或间接)自某个父类
两方法返回值均为True或False
类型判断演示
遍历对象,判断对象所属类型和父类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 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类型判断案例
根据所属类型, 设置指定的样式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | 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之后才会销毁对象。
这样做的好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时。
删除对象案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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才被删除
到此这篇关于PyQt5对象类型的判定,对象删除操作详细解读的文章就介绍到这了,更多相关PyQt5对象类型判定内容请搜索IT俱乐部以前的文章或继续浏览下面的相关文章希望大家以后多多支持IT俱乐部!