一、QObject描述:

PyQt几乎所有的类都是从QObject直接或间接继承的,QObject是所有PyQt类的基类,是PyQt对象模型的核心。

二、基类QObject的功能:

(一)操作对象名称、属性:

   1、API介绍:

(1)setObjectName("唯一名称"):给一个Qt对象设置一个名称,一般这个名称是唯一的,当做对象的ID来使用;

  (2)objectName():获取一个Qt对象的名称;

(3)setProperty("属性名称",值):给一个Qt对象动态的添加一个属性与值;

  (4)property("属性名称"):获取一个对象的属性值;

  (5)dynamicPropertyNames():获取一个对象中所有通过setProperty()设置的属性名称;

  2、应用实例:

    用于QSS的ID选择器,属性选择器:

  (1)QSS样式文件代码(文件名:QObject.qss):

  1. #ID选择器:#notice,匹配所有的ID为#notice的QLabel控件,这里的ID实际上就是objectName指定的值;
  2. QLabel#notice {
  3. font-size: 20px;
  4. color: gray;
  5. border: 1px solid gray;
  6. border-radius: 8px;
  7. }
  8. #属性选择器:匹配所有的notice_level属性是normal的且ID为notice的QLabel控件;
  9. QLabel#notice[notice_level="normal"] {
  10. color: green;
  11. border-color: green;
  12. }
  13. #属性选择器:匹配所有的notice_level属性是warning的且ID为notice的QLabel控件;
  14. QLabel#notice[notice_level="warning"] {
  15. color: yellow;
  16. border-color: yellow;
  17. }
  18. #属性选择器:匹配所有的notice_level属性是error的且ID为notice的QLabel控件;
  19. QLabel#notice[notice_level="error"] {
  20. color: red;
  21. border-color: red;
  22. }

  (2)窗口界面创建代码:

  1. from PyQt5.Qt import *
  2.  
  3. class Window(QWidget):
  4. def __init__(self):
  5. super().__init__()
  6. self.setWindowTitle("QObject的对象名称,属性")
  7. self.resize(500, 500)
  8. self.setup_ui()
  9.  
  10. def setup_ui(self):
  11. self.QObjectOperate()
  12.  
  13. def QObjectOperate(self):
  14.  
  15. # *************案例演示***************开始
  16. with open("QObject.qss", "r") as f:
  17. qApp.setStyleSheet(f.read())
  18. #实例化一个QLabel对象label;
  19. label = QLabel(self)
  20. #设置对象label对象名为"notice"
  21. label.setObjectName("notice")
  22. #设置对象label的"notice_level"属性值为"warning";
  23. label.setProperty("notice_level", "warning")
  24. label.setText("属性为warning的Qlabel")
  25.  
  26. label2 = QLabel(self)
  27. label2.move(100, 100)
  28. label2.setObjectName("notice")
  29. label2.setProperty("notice_level", "error")
  30. label2.setText("属性为error的Qlabel")
  31.  
  32. label3 = QLabel(self)
  33. label3.setText("原始格式")
  34. label3.move(150, 150)
  35.  
  36. btn = QPushButton(self)
  37. btn.setObjectName("notice")
  38. btn.setText("ID为notice的Qlabel")
  39. btn.move(50, 50)
  40.  
  41. # *************案例演示***************结束
  42.  
  43. if __name__ == '__main__':
  44. import sys
  45. app = QApplication(sys.argv)
  46. window = Window()
  47. window.show()
  48. sys.exit(app.exec_())

  (3)实例代码运行结果:

(二)父子对象的操作:

   1、API介绍:

  (1)setParent(parent):用于设置父对象 (父对象只能设置一个);

  (2)parent():获取父对象;

  (3)children():获取所有直接子对象;

  (4)findChild(参数1, 参数2, 参数3): 获取某一个指定名称和类型的子对象,参数1(类型:QObject,类型元组:(QPushButton, QLabel),参数2(名称),参数3(查找选项:Qt.FindChildrenRecursively为递归查找,Qt.FindDirectChildrenOnly为只查找直接子对象);

  (5)findChildren(参数1, 参数2, 参数3):获取某多个指定名称和类型的子对象;

  2、应用实例:

   涉及到Qt对象内存管理机制:当使用另一个QObject作为父对象创建QObject时,将自动添加到父对象的children()列表中,父对象会在被删除时自动删除子项;

(1)父子对象操作实例代码:

  1. from PyQt5.Qt import *
  2.  
  3. class Window(QWidget):
  4. def __init__(self):
  5. super().__init__()
  6. self.setWindowTitle("QObject的对象名称,属性")
  7. self.resize(500, 500)
  8. self.setup_ui()
  9.  
  10. def setup_ui(self):
  11. self.QObject对象的父子关系操作()
  12.  
  13. def QObject对象的父子关系操作(self):
  14. # *************内存管理机制***************开始
  15. obj1 = QObject()
  16. self.obj1 = obj1
  17.  
  18. obj2 = QObject()
  19. # 设置obj1为obj2的父对象;
  20. obj2.setParent(obj1)
  21.  
  22. # 监听obj2对象被释放
  23. obj2.destroyed.connect(lambda: print("obj2对象被释放了"))
  24.  
  25. # 父对象会在被删除时自动删除子项obj2;
  26. del self.obj1
  27.  
  28. # *************内存管理机制***************结束
  29.  
  30. if __name__ == '__main__':
  31. import sys
  32. app = QApplication(sys.argv)
  33. window = Window()
  34. window.show()
  35. sys.exit(app.exec_())

(2)实例代码运行输出结果:

  1. "C:\Program Files\Python35\pythonw.exe" C:/Users/L/PycharmProjects/untitled3/Qobject2.py
  2. obj2对象被释放了
  3.  
  4. Process finished with exit code 0

(三)信号处理:

   1、API介绍:

(1)widget.信号.connect(槽):连接信号与槽;

(2)obj.disconnect():取消连接信号与槽;

(3)widget.blockSignals(bool):临时(取消)阻止指定控件所有的信号与槽的连接;

(4)widget.signalsBlocked():信号是否被阻止;

(5)widget.receivers(信号):返回连接到信号的接收器数量;

2、应用实例:

            (1)实例代码:

  1. from PyQt5.Qt import *
  2.  
  3. class Window(QWidget):
  4. def __init__(self):
  5. super().__init__()
  6. self.setWindowTitle("QObject的对象名称,属性")
  7. self.resize(500, 500)
  8. self.setup_ui()
  9.  
  10. def setup_ui(self):
  11. self.QObject信号的操作()
  12. def QObject信号的操作(self):
  13. self.obj = QObject()
  14. #定义槽
  15. def obj_name_cao(name):
  16. print("对象名称发生了改变", name)
  17. #连接信号与槽
  18. self.obj.objectNameChanged.connect(obj_name_cao)
  19. #改变对象名称,发送信号
  20. self.obj.setObjectName("xxx")
  21. #取消连接信号与槽
  22. self.obj.disconnect()
  23. ##改变对象名称,发送信号,但信号与槽已断开,所以不调用obj_name_cao函数;
  24. self.obj.setObjectName("xxTT")
  25. #返回信号是否被阻止
  26. print(self.obj.signalsBlocked())
  27.  
  28. if __name__ == '__main__':
  29. import sys
  30. app = QApplication(sys.argv)
  31. window = Window()
  32. window.show()
  33. sys.exit(app.exec_())

(2)代码输出结果:

  1. "C:\Program Files\Python35\pythonw.exe" C:/Users/L/PycharmProjects/untitled3/Qobject2.py
  2. 对象名称发生了改变 xxx
  3. False

(四)类型判定:

1、API介绍:

  (1)obj.inherits(父类)     :返回对象是否属于父类
        (2) obj.isWidgetType() :返回对象是否属于QWidget;

2、实例:

  1. #案例——判定控件是否为标签,将所有标签背景色设为red
  2.  
  3. from PyQt5.Qt import *
  4. import sys
  5. app=QApplication(sys.argv)
  6. window = QWidget()
  7. a = QLabel(window)
  8. a.move(100,200)
  9. b = QPushButton(window)
  10. b.move(300,200)
  11. c = QLabel(window)
  12. c.move(200,200)
  13. for widget in window.children():
  14. if widget.inherits("QLabel"):
  15. widget.setStyleSheet('background-color:red')
  16. window.show()
  17.  
  18. sys.exit(app.exec_())

(五)对象删除:

1、API介绍:

obj.deleteLater():删除一个对象时, 也会解除它与父对象之间的关系,deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象,这样做的好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时。

(六)定时器:

1、API介绍:

(1)startTimer(ms, Qt.TimerType) -> timer_id:开启一个定时器;Qt.TimerType:1、Qt.PreciseTimer(精确定时器:尽可能保持毫秒准确);2、Qt.CoarseTimer(粗定时器:5%的误差间隔);3、    Qt.VeryCoarseTimer(很粗的定时器:只能到秒级);

(2)killTimer(timer_id):根据定时器ID,杀死定时器;

(3)timerEvent():定时器执行事件

2、应用实例:

代码功能:完成10~0的倒计时,最后输出“stop!"

  1. from PyQt5.Qt import *
  2. import sys
  3. class MyLabel(QLabel):
  4. def __init__(self,*args,**kwargs):
  5. super().__init__(*args,**kwargs) #重新对控件进行封装
  6. self.setText('10')
  7. self.setStyleSheet('font-size:22px;')
  8. self.resize(300,200)
  9. self.timer_id = self.startTimer(1000) #在这里生成timer_id
  10. def timerEvent(self, a0: 'QTimerEvent'):
  11. current_sec = int(self.text())
  12. current_sec -= 1
  13. self.setText(str(current_sec))
  14. if current_sec == 0:
  15. self.setText("stop!")
  16. self.killTimer(self.timer_id)
  17. app=QApplication(sys.argv)
  18. window = QWidget()
  19. window.resize(500,500)
  20. label = MyLabel(window) #这里实例化的重构后的QObject
  21. label.move(200,200)
  22. window.show()
  23. sys.exit(app.exec_())

PyQt5编程学习之控件基类QObject深入的更多相关文章

  1. 背水一战 Windows 10 (77) - 控件(控件基类): ContentControl, UserControl, Page

    [源码下载] 背水一战 Windows 10 (77) - 控件(控件基类): ContentControl, UserControl, Page 作者:webabcd 介绍背水一战 Windows ...

  2. 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中的元素

    [源码下载] 背水一战 Windows 10 (76) - 控件(控件基类): Control - 基础知识, 焦点相关, 运行时获取 ControlTemplate 和 DataTemplate 中 ...

  3. 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, VerticalAlignment

    [源码下载] 背水一战 Windows 10 (75) - 控件(控件基类): FrameworkElement - 基础知识, 相关事件, HorizontalAlignment, Vertical ...

  4. 背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件

    [源码下载] 背水一战 Windows 10 (74) - 控件(控件基类): UIElement - 与 CanDrag 相关的事件, 与 AllowDrop 相关的事件 作者:webabcd 介绍 ...

  5. 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作

    [源码下载] 背水一战 Windows 10 (73) - 控件(控件基类): UIElement - 拖放的基本应用, 手动开启 UIElement 的拖放操作 作者:webabcd 介绍背水一战 ...

  6. 背水一战 Windows 10 (72) - 控件(控件基类): UIElement - UIElement 的位置, UIElement 的布局, UIElement 的其他特性

    [源码下载] 背水一战 Windows 10 (72) - 控件(控件基类): UIElement - UIElement 的位置, UIElement 的布局, UIElement 的其他特性 作者 ...

  7. 背水一战 Windows 10 (71) - 控件(控件基类): UIElement - RenderTransform(2D变换), Clip(剪裁)

    [源码下载] 背水一战 Windows 10 (71) - 控件(控件基类): UIElement - RenderTransform(2D变换), Clip(剪裁) 作者:webabcd 介绍背水一 ...

  8. 背水一战 Windows 10 (70) - 控件(控件基类): UIElement - Transform3D(3D变换), Projection(3D投影)

    [源码下载] 背水一战 Windows 10 (70) - 控件(控件基类): UIElement - Transform3D(3D变换), Projection(3D投影) 作者:webabcd 介 ...

  9. 背水一战 Windows 10 (69) - 控件(控件基类): UIElement - Manipulate 手势处理, 路由事件的注册, 路由事件的冒泡, 命中测试的可见性

    [源码下载] 背水一战 Windows 10 (69) - 控件(控件基类): UIElement - Manipulate 手势处理, 路由事件的注册, 路由事件的冒泡, 命中测试的可见性 作者:w ...

  10. 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件

    [源码下载] 背水一战 Windows 10 (68) - 控件(控件基类): UIElement - Pointer 相关事件, Tap 相关事件, Key 相关事件, Focus 相关事件 作者: ...

随机推荐

  1. String类为什么要用final修饰?

    final修饰符的意义? https://www.cnblogs.com/loren-Yang/p/13380318.html String类被实现的目标是什么? 效率和安全 如何实现期望? 参考文献 ...

  2. Ubuntu设置初始root密码,开启远程访问

    [Ubuntu设置初始root密码,开启远程访问] 初始化root密码 ubuntu安装好后,root初始密码(默认密码)不知道,需要设置. 先用安装时候的用户登录进入系统 输入:sudo passw ...

  3. drf(分页、IP限制用户频率、自动生成文档、RBAC、django缓存)

    一 分页 settings.py REST_FRAMEWORK = {'PAGE_SIZE': 2, } views.py # 分页 from rest_framework.pagination im ...

  4. 使用Java给图片添加水印

    什么是水印呢?比如使用手机拍摄一张照片的时候,照片右下角的位置显示得有日期和时间信息,那就表示一个水印. 项目开发中给图片添加水印的操作很常见,比如给图片添加日期和时间,给图片添加公司的logo之类的 ...

  5. 使用apache发布网站

    只要建立网站和修改apache的配置文件即可 记事本打开apache\conf下的httpd.conf 用搜索找到DocumentRoot DocumentRoot是设置对外发布的网站目录的命令 将目 ...

  6. 如何用Flask中的Blueprints构建大型Web应用

    本文分享自华为云社区<构建大型Web应用Flask中的Blueprints指南>,作者: 柠檬味拥抱. 什么是Blueprints? Blueprints是Flask中的一种模式,用于将应 ...

  7. 【已解决】linux环境jps命令不显示进程

    2021-09-28 10:26:42 问题描述: 输入jps后不显示进程 解决办法 1. cd /tmp/hsperfdata_root/ 2. ls 如果是空的 3. rm -rf hsperfd ...

  8. System.gc 之后到底发生了什么 ?

    本文基于 OpenJDK17 进行讨论 在 JDK NIO 针对堆外内存的分配场景中,我们经常会看到 System.gc 的身影,比如当我们通过 FileChannel#map 对文件进行内存映射的时 ...

  9. #链表#CF706E Working routine

    题目 给出一个 \(n*m\) 的矩阵,每次交换两个等大的矩阵,输出 \(q\) 次操作后的矩阵 分析 维护向右和向下的指针,考虑最后输出只需要从每行的头指针向右跳, 那么修改实际上是将矩阵左边一列. ...

  10. #CDQ分治,单调栈,双指针#BZOJ 4237 稻草人 AT1225 かかし

    洛谷传送门 BZOJ 4237 稻草人 题意 在一个平面直角坐标系上给出\(n\)个点, 问有多少个点对\((i,j)\)满足\(x_i<x_j,y_i<y_j\), 而且对于\(n\)个 ...