深入探索Python PyQt5对象类型的判定与删除技巧
深入探索 Python PyQt5 对象类型的判定与删除技巧是在使用 PyQt5 进行开发时必备的技能之一。判定对象类型可以帮助我们了解操作的目标对象,而删除技巧则能够有效地释放内存并清理不再需要的对象。在 PyQt5 中,我们可以使用isinstance()函数对对象的类型进行判定,例如判断一个对象是否为 QWidget 类型。通过使用这个方法,我们可以根据对象类型采取不同的处理方式。另外,在删除对象时,我们可以使用deleteLater()方法来延迟删除一个对象,从而避免在删除前出现潜在的问题。掌握了这些技巧,可以更好地进行 PyQt5 的开发,提高代码的可维护性和性能。
PyQt5 类型判定
主要是用来判定一个对象的类型,或者说是否继承自某个类
相关 API 和应用场景如下
主要有两个方法
isWidgetType()判断某个对象是都控件类型inherits()一个对象是否继承(直接或间接)自某个父类
两方法返回值均为 True 或 False。

类型判断演示
遍历对象,判断对象所属类型和父类:
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 类型判断案例
根据所属类型, 设置指定的样式:
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 之后才会销毁对象。
这样做的好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时。
删除对象案例
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 对象类型的判定与删除技巧的详细内容,更多请关注码云笔记其它相关文章!
以上关于深入探索Python PyQt5对象类型的判定与删除技巧的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 深入探索Python PyQt5对象类型的判定与删除技巧

微信
支付宝