PyQt5学习
QObject学习
Desctiption
QObject类是所有Qt对象的基类,且QObject是Object的子类。先学习QObject类有助于其子类(如QWidget类)的学习。
设置对象姓名和属性
API
API | Notes |
---|---|
.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')]
应用场景:
- qss的id选择器,属性选择器
QLabel #Notice [Property1="Error"]{
font-size :20px;
color:red;
}
- 装饰器的信号与槽
父子对象关系
API
API | Note |
---|---|
setParent(parent) | 设置一个父级 |
parent() | 返回父级地址 |
children() | 返回所有孩子地址 |
findChild(参数1, 参数2, 参数3) | 返回指定名字或类型的对象地址。参数1是类型或类型元组;参数2是名称;参数三是查找选项,默认为递归查找Qt.FindChildrenRecursively ,也可以设置为Qt.FindDirectChildrenOnly 只查找直接子对象。 |
findChildren(参数1, 参数2, 参数3) | 查找所有子对象 |
应用场景:
- 涉及Qt的内存管理机制
- 如果一个控件没有任何父控件,会被当做是顶层控件
- 如果设置了父控件,则显示位置受限于父控件内,且生命周期会被父控件接管。
案例:
设置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
Signal | Note |
---|---|
objectNameChanged(objectName) | 名字改变时发送信号(且发送改变的名字) |
destroyed(obj) | 对象被销毁时, 发射此信号 |
API | Note |
---|---|
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
API | Note |
---|---|
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
API | Note |
---|---|
startTime(ms,Qt.TimerType)->timer_id | 开启一个计时器;TimerType有如下类型:Qt.PreciseTimer ,Qt.CoarseTimer 和Qt.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_())