通过本文章,可以掌握以下内容:
- Pyside6控件类的属性与方法
- Pyside6的控件为什么看不到实现过程
- Pyside6如何查看相关类的属性和方法作用
对于一个Python小白来说,在学习Pyside6的控件时,照着网上的一些示例,可以将很快将控件运行出来。但在看控件python源代码时,却很是迷惑,本文就以QWidget为例,进行展开解读。
如上图是QWidget部分Python源代码,你能看懂多少?
- 大部分方法都包含self参数,其作用是什么?
- 为什么方法体很多都是空实现,用pass或者简单返回,并未看到具体实现,为何能正常使用方法?
- 定义的枚举和属性都是none,为何能使用枚举类,以及枚举类的枚举值在哪?
一、Pyside6类的属性与方法
要了解控件大部分方法为什么都包含self参数,只需要了解Python类、实例的属性和方法即可。
实例属性与类属性
类的对象,就是类的一个实例。类的实例属性被对象所有,包含在每个对象之中,不同的对象之间,互不干扰。类的类属性被类所有,被包含在类中,是所有的类对象共享。一般情况下,实例属性会在__init__ 方法中声明并初始化,并且使用self 来绑定。而类属性是在类作用域中被声明,并且不使用self 来绑定。
实例方法,类方法,静态方法
Python 类中有三种方法:
- 实例方法:属于对象,方法中都有一个self 参数(代表对象本身)。实例方法只能由对象调用,不能通过类名访问。实例方法中可以访问实例属性和类属性。
- 类方法:属于类,方法中都有一个cls 参数(代表类本身)。类方法即可以通过类名访问,也可以通过对象访问,类方法中只能访问类属性,不能访问实例属性。定义类方法需要用到装饰器@classmethod
- 静态方法:没有self 参数,也没有cls 参数。因此,在静态方法中,既不能访问类属性,也不能访问实例属性。静态方法可以使用类名访问,也可以使用对象访问。定义静态方法需要用到装饰器@staticmethod
注意:Python 解释器在构造类与对象时,类是先于对象产生的。因此,类属性与类方法是先于实例属性与实例方法产生的。所以当类方法产生时,还没有实例属性,因此,类方法中不能访问实例属性。
专有方法
以双下划线__开头且结尾的方法__xxx__,就是专有方法,也称魔法方法。这些方法都被Python 赋予了特殊的含义,用户可以根据需要,来实现这些方法。比如QWidget类重写了Python object的方法:
- __delattr__:Python 中的一个特殊方法,用于自定义删除对象属性的行为。当你使用执行del obj.attribute语句删除对象的属性时,__delattr__ 方法会被调用,
- __init__:负责初始化实例,在实例创建之后调用。它是一个实例方法,用于设置实例属性和执行其他初始化操作
- __new__:负责创建实例,在实例化对象时首先调用。它是一个静态方法,返回类的一个新实例
- __repr__:返回对象的字符串表示,通常用于调试
- __setattr__:用于设置对象的属性值,在赋值时自动调用
二、Pyside6的调用过程
在开发Pyside6的时候,很多源代码只包含方法名、pass 关键字和空的枚举类,那pyside6的代码在实例化以及调用方法时,整个过程是怎样的呢。
在 PySide6 中,Python和Qt的C++库之间的关联是通过绑定技术实现的。具体来说,PySide6使用Shiboken,这是一种绑定生成工具,它自动将C++类和函数映射到Python。通过这种方式,PySide6可以在Python中使用Qt的功能。关键技术概念:
- Shiboken:这是一个自动化工具,用于将 C++ 代码绑定到Python。Shiboken分析Qt 的 C++头文件,生成相应的 Python 绑定代码。这使得我们可以在 Python 中使用 Qt 的 C++ 类和方法。
- 类型转换:Shiboken 处理C++和Python类型之间的转换。对于每个C++类型,Shiboken生成相应的Python类型包装器,并处理两者之间的数据转换。
- 方法和属性绑定:Shiboken生成的绑定代码将C++类的方法和属性映射到Python类。这包括普通方法、虚方法、信号和槽。
在 PySide6中,staticMetaObject是一个静态属性,存在于所有继承自QObject的类中。它的主要作用是提供对Qt元对象系统(Meta-Object System)的访问。这个元对象系统在 Qt 中用于实现信号与槽机制、属性系统以及其他反射(reflection)功能。
元对象系统(Meta-Object System)
Qt 的元对象系统是一种运行时类型信息系统,提供以下功能:
- 信号与槽机制:用于对象之间的通信。
- 动态属性系统:允许在运行时查询和操作对象的属性。
- 反射:允许在运行时查询类的元数据(例如类名、方法列表等)。
staticMetaObject 的作用
staticMetaObject 是一个包含类的元数据的对象,提供了对以下内容的访问:
- 类名:对象的类名。
- 信号和槽:类中定义的信号和槽。
- 属性:类中定义的属性。
- 方法:类中定义的方法。
staticMetaObject在PySide6中提供了对Qt元对象系统的访问,允许在运行时查询类的元数据。它是实现动态属性访问、信号与槽机制以及反射功能的基础,极大地增强了代码的灵活性和动态特性。
三、正确使用Pyside6控件类
如何正确使用Pyside6的控件,我们需要了解Qt for Python相关文档
访问QT官网地址
访问官网:https://doc.qt.io/qtforpython-6/search.html,选择对应pyside的版本。
搜索控件类
比如想了解Qwidget类,在上面搜索框中输入关键字回车。
查看控件类信息
基于上面搜索结果,点击进去,可以看到类的详细信息,包括类的继承关系、属性、方法、枚举类、信号。可以通过右边列表快速定位属性和方法
针对枚举类,拷贝Python源代码到界面搜索,即可看到使用方法,如Qwidget类定义的RenderFlag = None,可以搜索RenderFlag,就可以知道有哪些枚举值。