公众号:uncle39py

V1

2023/04/21阅读:12主题:默认主题

20.PyQt最基的基类QObject

QObject是所有对象的基类,所以先学习它

1.对象的名称,属性

obj = QObject()
obj.setObjectName("notice"#给qt对象设置一个名称,当作ID使用
obj.objectName() #获取名称

obj.setProperty("level","error"#给其他对象添加一个属性和值
obj.prroperty("level"#获取属性对应的值

obj.dynamicPropertyNames() #获取对象中所有通过setProperty()设置的属性名称

应用场景:比如设置样式,有30个控件需要设置为A样式,那么这30个控件可以设置相同的objectName,或者某个属性对应的值相同.

主要是给程序调度使用的,很像:班级1的学生;男生;会唱歌的人等等各种标签.

2.控件的父子关系

如果想要一个控件被包含在另外一个控件内部(比如输入框在窗口里面),就需要设置父子关系

如果一个控件没有任何父控件,那么就会被当成顶层控件(窗口),顶层控件相互独立;

obj1 = QObject()
obj2 = QObject()
obj1.setParent(obj2) #设置父控件
obj1.parent() #获取父控件

obj2.children() #获取所有的直接子控件
obj2.findChild() #查出一个
obj2.findChildren(类名) #查出多个

#案例:
win = QWidget()  #父控件:窗口
label = QLabel()  #子控件:标签
label.setParent(win) #标签显示在窗口中

3.信号与槽

信号:当一个控件状态发生改变时,会向外界发出信号,比如按钮的点击信号;每个控件都有自己的信号

槽: 一个函数

简单讲就是:控件发出一个信号,程序会自动去触发执行槽函数

这里需要我们做的事情就是准备好槽函数,然后把信号和槽函数关联起来: obj.信号.connect(槽)

QObject涉及的信号如下:

obj = QObject()
def destroy_cao(obj):  #槽函数
    print(obj,"对象被释放了")

obj.destroyed.connect(destroy_cao) 
#建立连接,仅仅是建立连接而已,信号触发的时候才会执行槽函数
#destroyed为控件自带的信号,会被子类继承,每个控件有其特定的信号

补充:点进destroyed函数,其参数为向外界槽函数传递的参数,即:信号触发时会向槽函数传递一个参数,代表是哪个对象被释放了

obj = QObject()
def name_change_cao(name):
    print("对象名称发生改变",name)

obj.objectNameChanged.connect(name_change_cao)
obj.setObjectName("egg")

obj.信号.disconnect() 断开连接,触发信号后没有相应的槽函数执行动作

obj.blockSignals(True)临时断开连接

obj.blockSignals(False)恢复连接

obj.signalsBlocked()返回布尔值,代表是否临时断开连接

obj.receivers(obj.信号)查看当前信号连接了几个槽函数

4.类型判断(知道下即可)

obj = QObject()
w = QWidget()
btn = QPushButton()
label = QLabel()

objs = [obj,w,btn,label]
for o in objs:
    print(o.isWidgetType()) #判断时候是控件类型(继承自QWidget)
    print(o.inherits("QWidget"))  #判断是否继承自某一个父类(直接或间接继承)
    
#场景:取出窗口下的所有控件self.children(),过滤出某个具体控件如标签控件,做统一的样式设计

5.删除控件

obj.deletelater() 会将窗口中的控件删除,界面上不会展示出控件来(记住此句,以下了解)

  • obj.deletelater()没有在代码当下将对象销毁,而是在主消息循环结束后才销毁对象,所以此函数后还可以使用obj

  • 删除对象的时候,会解除它与父控件的父子关系,所以会被删除

  • del obj在此处并不能删除控件,因为目前还会有一个父控件引用着子控件

6.定时器(某个时间间隔做什么事情)

obj = QObject()
timer_id = obj.startTimer(1000)
#每隔1秒会自动去执行QObject里面的timerEvent()方法,
#但是我们不可能去改源码里面的timerEvent()方法,所以需要继承QObject类,重写此方法来实现
#实际使用的时候,可以继承自任意具体的控件
class MyQObject(QObject): #实际使用的时候,可以继承自任意具体的控件
    def timerEvent(self,evt):
        print(evt)
        
obj = MyQObject()
timer_id = obj.startTimer(1000#会返回一个id,关闭的时候使用

obj.killTimer(timer_id)

倒计时小案例:一个窗口内有一个数字,每隔1秒减1,倒计时到0停下

from PyQt5.Qt import *
import sys
class MyLable(QLabel):
    def __init__(self,val,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.setText(val)
        self.move(140100)

    def start_time(self):
        self.timer_id = self.startTimer(1000#把返回的timer_id存到对象的属性里面

    def timerEvent(self,evt): #定时器自动运行的方法
        sec = self.text()
        sec = int(sec)-1
        self.setText(str(sec))
        if sec==0:
            self.killTimer(self.timer_id) #关闭定时器
            print("stop")


class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("窗口标题")
        self.resize(300,300)
        self.setup_ui()
        self.show()

    def setup_ui(self):
        label = MyLable("9",self) 
        label.start_time() #开启定时器

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Window()
    sys.exit(app.exec_())

分类:

后端

标签:

后端

作者介绍

公众号:uncle39py
V1