0
点赞
收藏
分享

微信扫一扫

PyQt5学习 01—— QObject

阎小妍 2022-05-05 阅读 70

PyQt5学习

QObject学习

Desctiption

QObject类是所有Qt对象的基类,且QObject是Object的子类。先学习QObject类有助于其子类(如QWidget类)的学习。

设置对象姓名和属性

API

APINotes
.setObjectName()对象名字
objectName()获取对象名字
setProperty(“属性名称”,值)设置对象属性及值
property(“属性名称”)获取对象属性
dynamicPropertyNames()获取对象所有通过setProperty获取的属性名

相关代码

 def QObject_name_property(self):
       obj = QObject()
       obj.setObjectName('Notice')
       print(obj.objectName())

       obj.setProperty('Property1','Error')
       obj.setProperty('Property2','Warning')
       print(obj.property('Property1'))
       print(obj.dynamicPropertyNames())

#Notice
#Error
#[PyQt5.QtCore.QByteArray(b'Property1'),PyQt5.QtCore.QByteArray(b'Property2')]

应用场景:

  1. qss的id选择器,属性选择器
QLabel #Notice [Property1="Error"]{
	font-size :20px;
	color:red;
}
  1. 装饰器的信号与槽

父子对象关系

API

APINote
setParent(parent)设置一个父级
parent()返回父级地址
children()返回所有孩子地址
findChild(参数1, 参数2, 参数3)返回指定名字或类型的对象地址。参数1是类型或类型元组;参数2是名称;参数三是查找选项,默认为递归查找Qt.FindChildrenRecursively,也可以设置为Qt.FindDirectChildrenOnly只查找直接子对象。
findChildren(参数1, 参数2, 参数3)查找所有子对象

应用场景:

  1. 涉及Qt的内存管理机制
  1. 如果一个控件没有任何父控件,会被当做是顶层控件
  2. 如果设置了父控件,则显示位置受限于父控件内,且生命周期会被父控件接管。

案例:
设置win1和win2窗口,分别为父子关系,背景分别为red和green,大小分别为(500,500)和(800,100)
效果应为,主窗口大小为(500,500),其中上方(500,100)为绿色,其余为红色(子控件被父控件受限了范围)

	win1 = QWidget()
    win1.setStyleSheet('background-color:red')
    win1.resize(500,500)

    win2 = QWidget()
    win2.setStyleSheet('background-color:green')
    win2.resize(800,100) 
    win2.setParent(win1)
    win1.show()

在这里插入图片描述

信号操作

信号与槽机制Signal and slot

基本概念:
用于对象之间的通讯。下面通俗解释:

假如点击按钮之后,标签会显示“你赢了”,那么点击按钮这一个动作就是信号,而标签显示你赢了就是槽。点击按钮和显示信息之间形成了一个通讯就是信号与槽机制。按钮被点击之后会自动发出一个clicked()函数,只需要把clicked()与标签修改做一个关联即可,连接就是connect()。

在这里插入图片描述
信号:当一个控件的状态发生改变时, 向外界发出的信息
槽:一个执行某些操作的函数/方法

特性:

API

SignalNote
objectNameChanged(objectName)名字改变时发送信号(且发送改变的名字)
destroyed(obj)对象被销毁时, 发射此信号
APINote
widget.信号.connect(槽)
obj.disconnect()obj可为控件或信号,表示取消控件所有信号连接or取消指定信号连接
widget.blockSignals(bool)临时阻止指定控件所有信号与槽连接
widget.signalsBlocked()是否被阻止
widget.receivers(信号)信号接收器数量

案例:

def QObject_signal(self):
        self.obj = QObject()
        def func(obj):
            print('delete obj:',obj)
        self.destroyed.connect(func)
        del self.obj
    #delete obj: <PyQt5.QtWidgets.QWidget object at 0x000001F151369700>

        def func2(obj):
            print('2NameChanged: ',obj)
        def func3(obj):
            print('3NameChanged: ',obj)
        self.obj = QObject()
        self.obj.objectNameChanged.connect(func2)
        self.obj.objectNameChanged.connect(func3)
        print(self.obj.receivers(self.obj.objectNameChanged))
        self.obj.setObjectName('1JJ')
        self.obj.blockSignals(True)
        self.obj.setObjectName('2KK')
        self.obj.blockSignals(False)
        self.obj.setObjectName('3LL')
    #    2
    #    2NameChanged:  1JJ
    #    3NameChanged:  1JJ
    #    2NameChanged:  3LL
    #    3NameChanged:  3LL


案例2:
点击按钮,输出’why click me’

btn = QPushButton(self)
btn.setText('点击')
def cao():
    print('why click me?')
btn.clicked.connect(cao)

在这里插入图片描述

类型判定

API

APINote
isWidgetType()判断是否是控件类型
inherits(父类)判断是否参数是其父类

案例:
给QLabel标签更改颜色

def QObject_judge(self):
        Label1 = QLabel(self)
        Label1.setText('Jeff is handsome')
        Label1.move(100,100)

        Label2 = QLabel(self)
        Label2.setText('Joa is beautiful')
        Label2.move(150,150)

        btn = QPushButton(self)
        btn.setText('button')

        for i in self.children() :  #这里写findchildren('QLable')可以直接找到
            if i.inherits('QLabel'):
                i.setStyleSheet('background-color:red;')

事件处理

简单版本的事件机制

信号与槽机制是对事件机制的一个高级封装,就是事件机制更面向底层。说明如下:

下面为图文演示这一机制:

定时器

API

APINote
startTime(ms,Qt.TimerType)->timer_id开启一个计时器;TimerType有如下类型:Qt.PreciseTimer,Qt.CoarseTimerQt.VeryCoarseTimer,分别表示精确计时器;粗定时器5%误差间隔;很粗的定时器 秒级
killTimer(timer_id)根据id杀死定时器
timerEvent定时器执行事件

案例1:
设置一个10s的定时器,在窗口label上显示倒计时,0的时候停止。但是如果要更该值的话,就很繁琐了。以后会学到自定义控件的方法

import sys
from PyQt5.QtWidgets import QWidget,QApplication,QLabel

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.initUi()

    def initUi(self):
        self.setWindowTitle('Timerrr')
        self.setGeometry(300,300,250,250)

class Label(QLabel) :
    def __init__(self,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.setText('10')
        self.move(100,100)
        self.setStyleSheet('font-size:30px')
        self.id = self.startTimer(1000)
    
    def timerEvent(self,*args,**kwargs):
        count = int(self.text())
        count -= 1
        self.setText(str(count))
        if(count==0):
            print('Stop')
            self.killTimer(self.id)




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

在这里插入图片描述在这里插入图片描述

举报

相关推荐

0 条评论