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

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

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

🏆 作者简介:景天科技苑

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

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

所属的专栏: PyQt5桌面应用开发,零基础到进阶应用实战
景天的主页: 景天科技苑

文章目录

PyQt5类型判定

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

相关API和应用场景如下

主要有两个方法

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

两方法返回值均为True或False

类型判断演示

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

python 复制代码
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类型判断案例

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

python 复制代码
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之后才会销毁对象。

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

删除对象案例

python 复制代码
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才被删除

相关推荐
Lsir10110_5 小时前
从按钮“点不动“讲起——深入理解 Qt 信号槽机制
开发语言·qt·信号处理
承渊政道5 小时前
Python IDLE鸿蒙PC适配全记录:用 ArkUI 重建编辑、运行、Shell 与基础调试闭环
python·microsoft·harmonyos·鸿蒙系统·pc端
zjh9005305 小时前
Kotlin黑科技:空安全与Java兼容性深度解析
python
lqj_本人5 小时前
WinMerge 鸿蒙 PC 适配全记录:以 Qt 重建桌面外壳,打通文件与文件夹差异闭环
qt·华为·harmonyos
黄昏恋慕黎明5 小时前
博客论坛技术迭代
python·pytest
我叫汪枫5 小时前
RAG 进阶:切分、检索、重排序,以及它和 Agent、微调、MCP 都是什么关系
开发语言·python
lqj_本人5 小时前
Tftpd64 鸿蒙 PC 适配全记录:用 Qt 重建一组可运行的 UDP 网络服务
qt·udp·harmonyos
冰芒芒5 小时前
构建你的第一个 Agent 项目
python
gf13211115 小时前
【python_发送飞书卡片消息_直接组装JSON格式发送卡片】
python·json·飞书
User_芊芊君子6 小时前
RStudio 鸿蒙 PC 适配全记录:以 Qt 原生工作区承载嵌入式 R
qt·r语言·harmonyos