广告位联系
返回顶部
分享到

python PyQt5对象类型的判定及对象删除操作介绍

python 来源:互联网 作者:佚名 发布时间:2024-07-18 18:14:30 人浏览
摘要

PyQt5类型判定 主要是用来判定一个对象的类型,或者说是否继承自某个类 相关API和应用场景如下 主要有两个方法 isWidgetType() 判断某个对象是都控件类型 inherits() 一个对象是否继承(直接或间接

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计