属性设置
# 下面所有demo写在这里
obj = QObject()
# 名称
obj.setObjectName("object") # 设置
print(obj.objectName()) # 获取
# 属性
obj.setProperty('!', '!') # 设置属性
obj.setProperty('notice', 'error') # 属性可设置多个
print(obj.property('notice')) # 获取属性
print(obj.dynamicPropertyNames()) # 获取所有属性的名
QWidget的方法
# 设置文本
obj.setText(text)
# 调整大小(可缩放)
obj.reisze(w,h)
# 设置固定大小(不可缩放)
obj.setFixedSize(w,h)
# 移动
obj.move(x,y)
# 禁用最大化、关闭按钮
obj.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)
判断类型
obj = QObject()
# 判断是否为控件类别
print(obj.isWidgetType())
# 判断是否继承自某一个类
print(obj.inherits('QWidget')) # QWidget也继承自QWidget类
# 可根据inherits和isWidgetType以另一种思路设计控件的qss样式
for widget in self.children():
if widget.inherits('QLabel'): # 若控件是QLabel类型,将文字变为blue
widget.setStyleSheet('color:blue;')
父子关系
obj0 = QObject()
obj1 = QObject()
obj2 = QObject()
obj3 = QObject()
obj4 = QObject()
obj5 = QObject()
obj5.setObjectName('obj5')
# 设置父对象
obj3.setParent(obj1)
obj4.setParent(obj2)
obj5.setParent(obj2)
obj1.setParent(obj0)
obj2.setParent(obj0)
print('obj4的parent:' , obj4.parent()) # 查找父对象
print('obj0的children:' , obj0.children()) # 查找所有直接子对象
print('obj0的findChild:' , obj0.findChild(QObject))
print('obj0的名字为"obj5"的findChild:',obj0.findChild(QObject,'obj5'))
print('obj0的findChildren:' , obj0.findChildren(QObject)) # 所有子孙对象
删除对象
self.obj0 = QObject()
obj1 = QObject()
obj2 = QObject()
obj2.setParent(obj1)
obj1.setParent(self.obj0)
self.obj0.destroyed.connect(lambda: print('obj0被销毁'))
obj1.destroyed.connect(lambda: print('obj1被销毁'))
obj2.destroyed.connect(lambda: print('obj2被销毁'))
# del obj1 # obj1被obj2引用,通过这种方式删除不了
'''以后删除对象就要用deleLater(),对象不是立即删除,而是下一次循环之后才销毁,所以deleLater()下面的语句也会执行'''
# 释放的时候,会解除对象父子关系,也就是obj0,obj2不再是obj1的父子
obj1.deleteLater()
# 手动销毁父对象, 当父对象被销毁时子对象自动销毁
# del self.obj0
信号与槽
示例1
obj = QObject()
# 绑定事件
obj.destroyed.connect(lambda o: print(o, '对象已被销毁!!'))
obj.objectNameChanged.connect(lambda new_name: print('对象名称已改变,名称为:', new_name))
obj.objectNameChanged.connect(lambda new_name: print('绑定的第2个函数已被执行:', new_name))
# 发生事件
obj.setObjectName('root')
# 解绑,会触发事件,但与槽失去连接,不执行事件函数
obj.objectNameChanged.disconnect()
# 临时阻断信号连接
obj.blockSignals(True)
obj.setObjectName('obj1')
# 恢复信号连接
obj.blockSignals(False)
obj.setObjectName('obj2')
# 获取是否临时阻断了连接
print(obj.signalsBlocked())
# 获取某个信号连接了几个槽函数
print(obj.receivers(self.obj.objectNameChanged))
# 触发销毁事件 -> 这里会在obj.signalsBlocked()前执行, 抛出异常
del obj
示例2
# 每次修改主窗口标题都会显示'Hello-新标题'
def name_change_func(title):
self.blockSignals(True) # 暂时阻断信号,防止无限递归
self.setWindowTitle('Hello,{}!'.format(title))
self.blockSignals(False) # 重连信号,保证修改多次title也可以正常实现功能
self.windowTitleChanged.connect(name_change_func)
self.setWindowTitle('lzc')
self.setWindowTitle('zs')
事件处理机制
事件处理机制相对于信号与槽,更加低级、偏向于底层
import sys
from PyQt5.Qt import QEvent, QObject
from PyQt5.QtWidgets import *
class MyApp(QApplication):
def notify(self, receiver, evt):
if evt.type() == QEvent.MouseButtonPress:
print("receiver: {}, evt: {}".format(receiver, evt))
return super().notify(receiver, evt)
class MyButton(QPushButton):
def event(self, evet):
if evet.type() == QEvent.MouseButtonPress:
print(evet)
return super().event(evet)
def mousePressEvent(self, *args, **kwargs):
print('鼠标在子函数中被按下...')
return super().mousePressEvent(*args, **kwargs)
if __name__ == '__main__':
app = MyApp(sys.argv)
root = QWidget()
root.resize(500, 300)
root.move(400, 400)
btn = MyButton(root)
btn.setText('按钮')
btn.move(100, 100)
btn.pressed.connect(lambda: print('按钮被点击了...'))
root.show()
sys.exit(app.exec_())