当前位置:   article > 正文

【Python】pyqt5-----QObject_python qobject

python qobject

 这个是我们程序的框架,下面介绍的函数可以往函数ui里添加做测试。

  1. from PyQt5.Qt import *
  2. import sys
  3. class Window(QWidget):
  4. def __init__(self):
  5. super().__init__()
  6. self.setWindowTitle("ABCDE")
  7. self.resize(500, 500)
  8. self.ui()
  9. def ui(self):
  10. obj = QObject()
  11. #往里面添加内容
  12. if __name__ == '__main__':
  13. app = QApplication(sys.argv)
  14. window = Window()
  15. window.show()
  16. sys.exit(app.exec_())

一、对象名称、属性

setObjectName("唯一名称")给Qt对象设置名字,一般这个名字是唯一的,当作ID使用。       
setProperty("属性名称",值)给一个Qt对象动态的 
objectName()获取一个Qt对象的名称。
property("属性名称")获取一个对象的属性值。
dynamicPropertyNames()获取一个对象中所有通过setProperty()设置的属性名称。

应用场景

  1. 用于qss的ID选择器,属性选择器,方便统一格式。
  2. 用于装饰器的信号与槽。

应用案例

案例:创建多个用于信息提示的QLable,信息提示分三个级别:正常、警告、错误。

qss文件:

  1. QLabel#notice {
  2. font-size: 40px;
  3. color: gray;
  4. border: 1px solid gray;
  5. border-radius: 10px;
  6. }
  7. QLabel#notice[notice_level="normal"] {
  8. color: green;
  9. border-color: green;
  10. }
  11. QLabel#notice[notice_level="warning"] {
  12. color: orange;
  13. border-color: orange;
  14. }
  15. QLabel#notice[notice_level="error"] {
  16. color: red;
  17. border-color: red;
  18. }

py文件:

  1. from PyQt5.Qt import *
  2. import sys
  3. class Window(QWidget):
  4. def __init__(self):
  5. super().__init__()
  6. self.setWindowTitle("Qobject的应用")
  7. self.resize(500, 500)
  8. self.ui()
  9. def ui(self):
  10. #使用qss
  11. with open("Qobject.qss", "r") as f:
  12. qApp.setStyleSheet(f.read())
  13. #第一个QLabel
  14. label = QLabel(self)
  15. label.setObjectName("notice")#设置ID
  16. label.setProperty("notice_level","normal")#设置属性与值
  17. label.setText("Normal")
  18. # 第二个QLabel
  19. label2 = QLabel(self)
  20. label2.move(0,100)
  21. label2.setObjectName("notice")
  22. label2.setProperty("notice_level", "warning")
  23. label2.setText("Warning")
  24. # 第三个QLabel
  25. label3 = QLabel(self)
  26. label3.move(0, 200)
  27. label3.setObjectName("notice")
  28. label3.setProperty("notice_level", "error")
  29. label3.setText("Error")
  30. if __name__ == '__main__':
  31. app = QApplication(sys.argv)
  32. window = Window()
  33. window.show()
  34. sys.exit(app.exec_())

效果:


二、对象的父子关系

setParent(parent)设置父对象。
parent()获取父对象。
chidren()获取所有直接子对象。
findChild(参数1,参数2,参数3)获取一个指定名称或类型的子对象,参数1:类型QObject;参数2:通过setObjectName函数设置的名字;参数3:默认是递归查找,另一种是只查找直接子对象[Qt.FindDirectChildrenOnly]
findChildren(参数1,参数2,参数3)获取多个指定名称或类型的子对象

三、信号的操作

信号(singal)和槽(Slot)是Qt中的核心机制,主要作用在于对象之间进行通讯。信号:当一个控件的状态发生变化时,向外界发出的信息。槽:一个执行操作的函数。所有继承自QWidge的控件都支持信号与槽的机制。

QObject的信号接收函数:

1.destroyed.connect()

该函数用于接收对象被释放的信号,槽就是当接收到信号后要执行的动作,动作可以写成方法传入。

  1. obj = QObject()
  2. def destroy_cao(obj): #这个就是槽
  3. print("对象被释放了!",obj)
  4. obj.destroyed.connect(destroy_cao) #接收信号

2.objectNameChanged.connect()

该函数用于接收对象名称被修改的信号。

  1. obj = QObject()
  2. def obj_name(obj):
  3. print("对象名称被修改了!",obj)
  4. obj.objectNameChanged.connect(obj_name)
  5. obj.setObjectName("CHANGE")

信号处理:

connect连接信号与槽。
disconnect断开信号与槽的连接。
blockSignals(bool)临时阻断信号与槽的连接,True:阻断。
signalsBlocked()返回信号与槽是否被阻断。
receivers("信号")返回连接到信号的接收器数量

例子----当标题被修改在前面加“change-”:

  1. window = Window()
  2. window.setWindowTitle("窗口")
  3. def win_change(title): #槽
  4. window.windowTitleChanged.disconnect() #断开标题信号与槽
  5. print("标题已被修改。", title) #提示标题修改的内容
  6. window.setWindowTitle("Change-"+title) #设置标题加上“change-”
  7. window.windowTitleChanged.connect(win_change)
  8. window.windowTitleChanged.connect(win_change)#连接标题信号与槽
  9. window.setWindowTitle("窗口1")
  10. window.setWindowTitle("窗口2")


四、类型判断----过滤筛选控件

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

例子----将窗口内所有的QLable控件设置背景色为cyan

  1. from PyQt5.Qt import *
  2. import sys
  3. class Window(QWidget):
  4. def __init__(self):
  5. super().__init__()
  6. self.setWindowTitle("Qobject的应用")
  7. self.resize(500, 300)
  8. self.ui()
  9. def ui(self):
  10. labeel1 = QLabel(self)
  11. labeel1.move(0,0)
  12. labeel1.setText("This is Label1")
  13. labeel2 = QLabel(self)
  14. labeel2.move(0, 50)
  15. labeel2.setText("This is Label2")
  16. btn = QPushButton(self)
  17. btn.move(0,100)
  18. btn.setText("Click!")
  19. for widget in self.children(): #获取窗口里的所以子类
  20. if widget.inherits("QLabel"): #筛选QLabel
  21. widget.setStyleSheet("background-color:cyan;") #设置背景色
  22. if __name__ == '__main__':
  23. app = QApplication(sys.argv)
  24. window = Window()
  25. window.show()
  26. sys.exit(app.exec_())


五、deleteLater对象删除

删除一个对象时,也会解除它与父类对象之间的关系。

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

看下面的代码:

  1. obj1 = QObject()
  2. obj2 = QObject()
  3. obj3 = QObject()
  4. obj3.setParent(obj2)
  5. obj2.setParent(obj1)
  6. self.obj1 = obj1 #self是QWidget类
  7. obj1.destroyed.connect(lambda : print("obj1被释放"))
  8. obj2.destroyed.connect(lambda : print("obj2被释放"))
  9. obj3.destroyed.connect(lambda : print("obj3被释放"))
  10. obj2.deleteLater()
  11. print(obj1.children())

运行结果:

可以看到程序先是输出了“obj2.deleteLater()”后面的print,在第二个消息循环才执行obj2.deleteLater()。


五、定时器

startTimer(ms,Qt.TimerType) -> timer_id

开启一个定时器。Qt.PreciseTimer:精准计时器-尽可能保持毫秒准度。Qt.CoarseTimer:粗定时器-5%的误差间隔。Qt.VeryCoarseTimer:很粗定时器-只能到秒级。

timer_id:定时器的ID

killTimer(timer_id)根据定时器的ID,删除定时器。
timeEvent()定时器的执行事件。

例子--实现倒计时

  1. from PyQt5.Qt import *
  2. import sys
  3. #创建一个QLabel的子类MyQLabel
  4. class MyQLabel(QLabel):
  5. def __init__(self, *args, **kwargs):
  6. super().__init__(*args, **kwargs)
  7. self.setText("10") #标签初始内容
  8. self.move(100,100) #设置标签位置
  9. self.setStyleSheet("font-size: 22px;") #设置标签样式
  10. self.time_id = self.startTimer(1000) #创建一个计时器
  11. # 重写timerEvent的方法
  12. def timerEvent(self, a0: 'Qt.PreciseTimer'):
  13. current_sec = int(self.text())
  14. current_sec -= 1
  15. self.setText(str(current_sec))
  16. if current_sec == 0:
  17. self.killTimer(self.time_id)
  18. #设置倒计时数
  19. def setSec(self,sec):
  20. self.setText(str(sec))
  21. class Window(QWidget):
  22. def __init__(self):
  23. super().__init__()
  24. self.setWindowTitle("Qobject的应用")
  25. self.resize(500, 300)
  26. self.ui()
  27. def ui(self):
  28. #设置标签
  29. label1 = MyQLabel(self)
  30. label1.setSec(10)
  31. if __name__ == '__main__':
  32. app = QApplication(sys.argv)
  33. window = Window()
  34. window.show()
  35. sys.exit(app.exec_())


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/816734
推荐阅读
相关标签
  

闽ICP备14008679号