一. PyQt5 类的继承结构图

二. 如何获取一个类的父类和子类?
使用
QObject.mro()
获取父类, 使用QObject.__subclasses__()
获取子类
from PyQt5.Qt import *
class Window(QWidget):
def __init__ (self):
super().__init__()
self.setWindowTitle("haha")
self.resize(600,500)
self.move(500,300)
self.setip_ui()
def setip_ui(self):
self.object_learn()
def object_learn(self):
mros = QObject.mro()
print("QObject的父类有")
for mro in mros:
print(mro)
subs = QObject.__subclasses__()
print("QObject的子类有")
for sub in subs:
print(sub)
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

三. 万物始源QObject类
1.属性与名称API
API | 功能 | 属性/方法 | 参数 | 返回值 |
---|---|---|---|---|
setObjectName("唯一名称") | 设置对象的名称 | 方法 | 名称:字符串 | 无 |
objectName() | 获取对象的名称 | 方法 | 无 | 名称:字符串 |
setProperty("属性名",值) | 设置对象的属性 | 方法 | 属性名:字符串,值:任意 | 无 |
property("属性名") | 获取对象的某个属性的值 | 方法 | 属性名:字符串 | 值: 任意 |
dynamicPropertyNames() | 动态列举通过setPropety方法添加的属性 | 方法 | 无 | 列表 |
应用场景:
- 设置qss样式表时要用, (ID选择器, 属性选择器要用到对象名 属性名等)
- 用于装饰器的属性于槽
比如在一个qss文件中:
QLabel#notice[level = "error"]{
font-size : 30px;
color : red
}
如果创建这样一个控件:
lb1= QLabel(self)
lb1.setText("熊爸")
lb1.setObjectName("notice")
lb1.setProperty("level","error")
那么他的样式就会改变

2. 父子对象的操作API
API | 功能 | 属性/方法 | 参数 | 返回值 |
---|---|---|---|---|
setParent(父对象) | 设置对象的父对象 | 方法 | 父对象 | 无 |
parent() | 获取对象的父对象 | 方法 | 无 | 父对象 |
children() | 获取子对象列表(不含孙子) | 方法 | 无 | 子对象列表 |
findChild(参一,参二,参三) | 寻找子孙的某个对象 | 方法 | 参1:对象类型,或对象类型元组, 参2:对象名称, 参3:查找选项: ①递归查找Qt.FindChildrenRecursively ②只查找子对象(不要孙子)Qt.FindDirectChildrenOnly |
符合要求的对象 |
findChildren(参一,参二,参三) | 同上,但会找全 | 方法 | 同上 | 符合要求的对象的列表 |
应用场景:
- 内存管理机制 : 构建父子关系,便于内存管理,生命周期管理
- 窗口机制: 如果一个控件没有父控件,会被当成窗口处理. 如果一个控件有父对象,他就被包含在父对象里,,父控件会约束子控件
3. 信号处理API
信号与槽机制参见上一篇
API | 功能 | 参数 | 返回值 |
---|---|---|---|
obj.信号名.connect(槽) | 将信号与槽建立联系 | 槽函数(槽函数可以接收obj传递的参数) | 无 |
例1:obj.destroyed.connect(func(obj)) | 将destroyed 信号与槽函数建立联系 | 槽函数(槽函数可以接收obj做参数) | 无 |
例2: obj.objectNameChanged.connect(func(objName)) | 将objectNameChanged信号与槽函数建立联系 | 槽函数(槽函数可以接收objName做参数) | 无 |
obj.信号名.disconnect(槽) | 将信号与槽的联系断开 | 槽函数(槽函数可以接收obj传递的参数) | 无 |
obj.blockSignals(bool) | 临时阻断信号与槽的连接 | 参数:True/False | 无 |
obj.signalsBlocked() | 信号是否被阻断 | 无 | bool,被阻断与否 |
obj.receivers(信号) | 连接该信号的槽的数量 | 无 | 返回槽函数的数量 |
QObject自带的信号:
- destroyed : 毁灭时触发的信号
- objectNameChanged : 对象名改变时触发的信号
槽函数接收参数例:
def object_api(self):
def haha(obj):
print("haha")
print(obj)
self.obj = QObject()
self.obj.destroyed.connect(haha)
应用场景:
- 监听信号, 响应用户行为
- 信号与槽机制
4. 类型判定
API | 功能 | 参数 | 返回值 |
---|---|---|---|
isWidgetType() | 判断对象是否是控件 | 无 | bool, 是否是控件 |
isWindowType() | 判断对象是否是窗体 | 无 | bool, 是否是窗体 |
inherits("类名") | 判断对象是否是继承了某个类 | 字符串,类名 | bool, 是否继承 |
应用场景:
- 控件的筛选
5. 对象删除
API | 功能 | 参数 | 返回值 |
---|---|---|---|
deleteLater() | 用此方法没有立刻删除对象 而是向主消息循环发送了一个event 下一次主消息循环才会触发这个事件 才会销毁对象也会解除其和所有父对象关系 这样我们可以在这个延迟时间内完成一些操作 |
无 | bool, 是否是控件 |
应用场景 :
- 删除控件 : 由于这个API会解除所有与父对象的关系, 而且可以删除对象, 所以经常用于删除不用的控件
网友评论