当前位置:   article > 正文

PyQt5之QObject API学习_pyqt5receivers

pyqt5receivers
  1. from PyQt5.Qt import *
  2. '''
  3. 对象名称、属性相关API:
  4. setObjectName("唯一名称"):给一个Qt对象设置一个名称,一般这是一个ID
  5. objectName():获取对象方法
  6. setProperty("属性名称",值):给一个Qt对象动态的添加一个属性与值
  7. property("属性名称"):获取一个对象的属性值
  8. dynamicPropertyNames():获取一个对象中所有通过setProperty()设置的属性名称
  9. 父子对象的操作:
  10. setParent(parent):设置父对象,父对象只能设置一个
  11. parent():获取父对象
  12. children():获取所有子对象
  13. findChild(参数1, 可选参数2, 可选参数3):获取某一个指定名称和类型的子对象
  14. findChildren(参数1, 可选参数2, 可选参数3):获取某多个指定名称和类型的子对象
  15. 信号处理:
  16. widget.信号.connect(槽):连接信号与槽
  17. obj.disconnect():取消连接信号与槽
  18. widget.blockSignals(bool):临时(取消)阻止指定控件所有的信号与槽的连接
  19. widget.signalsBlocked():信号是否被阻止
  20. widget.receivers(信号):返回连接到信号的接收器数量
  21. 类型判断:
  22. isWidgetType():判断是否是控件类型
  23. inherits(父类):一个对象是否继承(直接或者间接)自某个类
  24. 对象删除:
  25. obj.deleteLater():删除一个对象时, 也会解除它与父对象之间的关系
  26. deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象
  27. 这样做的好处是可以在这些延迟删除的时间内完成一些操作,坏处就是内存释放会不及时
  28. 事件处理:
  29. childEvent()
  30. customEvent()
  31. eventFilter()
  32. installEventFilter()
  33. removeEventFilter
  34. 自由主题
  35. 定时器:
  36. startTimer(ms, Qt.TimerType) -> timer_id:开启一个定时器
  37. 信号:
  38. objectNameChanged(objectName):对象名称发生改变时发射此信号
  39. destroyed(obj):对象被销毁时, 发射此信号
  40. '''
  41. class Window(QWidget):
  42. def __init__(self):
  43. super().__init__()
  44. self.setWindowTitle("QObject的学习")
  45. self.resize(500, 500)
  46. self.setup_ui()
  47. def setup_ui(self):
  48. # self.QObject继承结构测试()
  49. # self.QObject对象名称和属性的操作()
  50. # self.QObject对象的父子关系操作()
  51. # self.QObject信号的操作()
  52. self.QObject类型判定()
  53. # self.QObject对象删除()
  54. def QObject继承结构测试(self):
  55. # QObject.__subclasses__()
  56. mros = QObject.mro()
  57. for mro in mros:
  58. print(mro)
  59. def QObject对象名称和属性的操作(self):
  60. # *************测试API***************开始
  61. # obj = QObject()
  62. # obj.setObjectName("notice")
  63. # print(obj.objectName())
  64. #
  65. # obj.setProperty("notice_level", "error")
  66. # obj.setProperty("notice_level2", "warning")
  67. #
  68. # print(obj.property("notice_level"))
  69. # print(obj.dynamicPropertyNames())
  70. # **************测试API**************结束
  71. # *************案例演示***************开始
  72. with open("QObject.qss", "r") as f:
  73. qApp.setStyleSheet(f.read())
  74. label = QLabel(self)
  75. label.setObjectName("notice")
  76. label.setProperty("notice_level", "warning")
  77. label.setText("社会我顺哥")
  78. label2 = QLabel(self)
  79. label2.move(100, 100)
  80. label2.setObjectName("notice")
  81. label2.setProperty("notice_level", "error")
  82. label2.setText("人狠话不多")
  83. label3 = QLabel(self)
  84. label3.setText("xxxx")
  85. label3.move(150, 150)
  86. btn = QPushButton(self)
  87. btn.setObjectName("notice")
  88. btn.setText("btn")
  89. btn.move(50, 50)
  90. # label.setStyleSheet("font-size: 20px; color: red;")
  91. # *************案例演示***************结束
  92. def QObject对象的父子关系操作(self):
  93. # *************测试API***************开始
  94. # obj0 = QObject()
  95. # obj1 = QObject()
  96. # obj2 = QObject()
  97. # obj3 = QObject()
  98. # obj4 = QObject()
  99. # obj5 = QObject()
  100. # print("obj0", obj0)
  101. # print("obj1", obj1)
  102. # print("obj2", obj2)
  103. # print("obj3", obj3)
  104. # print("obj4", obj4)
  105. # print("obj5", obj5)
  106. #
  107. # obj1.setParent(obj0)
  108. # obj2.setParent(obj0)
  109. # obj2.setObjectName("2")
  110. # # label = QLabel()
  111. # # label.setParent(obj0)
  112. #
  113. #
  114. # obj3.setParent(obj1)
  115. # obj3.setObjectName("3")
  116. #
  117. # obj4.setParent(obj2)
  118. # obj5.setParent(obj2)
  119. #
  120. # # print(obj1.parent())
  121. #
  122. # # print(obj0.children())
  123. #
  124. # # print(obj0.findChild(QObject, "3", Qt.FindDirectChildrenOnly))
  125. # print(obj0.findChildren(QObject))
  126. # *************测试API***************结束
  127. # *************内存管理机制***************开始
  128. obj1 = QObject()
  129. self.obj1 = obj1
  130. obj2 = QObject()
  131. obj2.setParent(obj1)
  132. # 监听obj2对象被释放
  133. obj2.destroyed.connect(lambda : print("obj2对象被释放了"))
  134. del self.obj1
  135. # *************内存管理机制***************结束
  136. def QObject信号的操作(self):
  137. # self.obj = QObject()
  138. # # obj.destroyed
  139. # # obj.objectNameChanged
  140. # # def destroy_cao(obj):
  141. # # print("对象被释放了", obj)
  142. # #
  143. # # self.obj.destroyed.connect(destroy_cao)
  144. # #
  145. # # del self.obj
  146. # def obj_name_cao(name):
  147. # print("对象名称发生了改变", name)
  148. #
  149. # def obj_name_cao2(name):
  150. # print("对象名称发生了改变2", name)
  151. #
  152. # self.obj.objectNameChanged.connect(obj_name_cao)
  153. # self.obj.objectNameChanged.connect(obj_name_cao2)
  154. #
  155. # # print(self.obj.receivers("objectNameChanged")) X
  156. # print(self.obj.receivers(self.obj.objectNameChanged))
  157. # self.obj.setObjectName("xxx")
  158. #
  159. # # self.obj.objectNameChanged.disconnect()
  160. # # print(self.obj.signalsBlocked(), "1")
  161. # # self.obj.blockSignals(True)
  162. # # print(self.obj.signalsBlocked(), "2")
  163. # # self.obj.setObjectName("ooo")
  164. # #
  165. # # self.obj.blockSignals(False)
  166. # # print(self.obj.signalsBlocked(), "3")
  167. # # # self.obj.objectNameChanged.connect(obj_name_cao)
  168. # #
  169. # # self.obj.setObjectName("xxoo")
  170. # *************信号与槽案例***************开始
  171. # btn = QPushButton(self)
  172. # btn.setText("点击我")
  173. # def cao():
  174. # print("点我嘎哈?")
  175. #
  176. # btn.clicked.connect(cao)
  177. # *************信号与槽案例***************结束
  178. pass
  179. def QObject类型判定(self):
  180. # *************API***************开始
  181. # obj = QObject()
  182. # w = QWidget()
  183. # btn = QPushButton()
  184. # label = QLabel()
  185. #
  186. # objs = [obj, w, btn, label]
  187. # for o in objs:
  188. # # print(o.isWidgetType())
  189. # # print(o.inherits("QWidget"))
  190. # print(o.inherits("QPushButton"))
  191. # *************API***************结束
  192. # *************案例***************开始
  193. label1 = QLabel(self)
  194. label1.setText("社会我顺哥")
  195. label1.move(100, 100)
  196. label2 = QLabel(self)
  197. label2.setText("人狠话不多")
  198. label2.move(150, 150)
  199. # del label2
  200. label2.deleteLater()
  201. btn = QPushButton(self)
  202. btn.setText("点我")
  203. btn.move(200, 200)
  204. # for widget in self.findChildren(QLabel):
  205. for widget in self.children():
  206. # print(widget)
  207. # if widget.isWidgetType():
  208. if widget.inherits("QLabel"):
  209. widget.setStyleSheet("background-color: cyan;")
  210. # *************案例***************结束
  211. def QObject对象删除(self):
  212. obj1 = QObject()
  213. self.obj1 = obj1
  214. obj2 = QObject()
  215. obj3 = QObject()
  216. obj3.setParent(obj2)
  217. obj2.setParent(obj1)
  218. obj1.destroyed.connect(lambda : print("obj1被释放了"))
  219. obj2.destroyed.connect(lambda : print("obj2被释放了"))
  220. obj3.destroyed.connect(lambda : print("obj3被释放了"))
  221. # del obj2
  222. obj2.deleteLater()
  223. # print(obj1.children())
  224. print(obj2)
  225. # 才会真正的去释放相关的对象
  226. def QWidget控件的父子关系():
  227. # win1 = QWidget()
  228. # win1.setWindowTitle("红色")
  229. # win1.resize(500, 500)
  230. # win1.setStyleSheet("background-color: red;")
  231. # win1.show()
  232. #
  233. # win2 = QWidget()
  234. # win2.setWindowTitle("绿色")
  235. # win2.setStyleSheet("background-color: green;")
  236. # # win2.setParent(win1)
  237. # win2.resize(1000, 100)
  238. # win2.show()
  239. win_root = QWidget()
  240. label1 = QLabel()
  241. label1.setText("label1")
  242. label1.setParent(win_root)
  243. label2 = QLabel()
  244. label2.move(50, 50)
  245. label2.setText("label2")
  246. label2.setParent(win_root)
  247. label3 = QLabel()
  248. label3.move(80, 80)
  249. label3.setText("label3")
  250. label3.setParent(win_root)
  251. btn = QPushButton(win_root)
  252. btn.move(100, 100)
  253. btn.setText("btn")
  254. win_root.show()
  255. for sub_widget in win_root.findChildren(QLabel):
  256. print(sub_widget)
  257. sub_widget.setStyleSheet("background-color: cyan;")
  258. def 信号与槽():
  259. # 连接窗口标题变化的信号 与 槽
  260. def cao(title):
  261. # print("窗口标题变化了", title)
  262. # window.windowTitleChanged.disconnect()
  263. window.blockSignals(True)
  264. window.setWindowTitle("撩课-" + title)
  265. window.blockSignals(False)
  266. # window.windowTitleChanged.connect(cao)
  267. window.windowTitleChanged.connect(cao)
  268. window.setWindowTitle("Hello Sz")
  269. # window.setWindowTitle("Hello Sz2")
  270. # window.setWindowTitle("Hello Sz3")
  271. if __name__ == '__main__':
  272. import sys
  273. app = QApplication(sys.argv)
  274. # QWidget控件的父子关系()
  275. window = Window()
  276. # window = QWidget()
  277. window.show()
  278. sys.exit(app.exec_())

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号