如何理解并手动定义Python(PySide2)中QtSerialPort.QSerialPort.Data8类型
如何手动定义PySide2中类似QtSerialPort.QSerialPort.Data8的嵌套枚举类型?
你是Python新手,在使用PySide2时碰到QtSerialPort.QSerialPort.Data8这类嵌套类型——它看起来像枚举,但又不是普通的Python枚举类,想知道怎么手动定义这类类型,查源码也没找到头绪。
相关代码:
from PySide2 import QtSerialPort obj_databits = QtSerialPort.QSerialPort.Data8 print(obj_databits)
PyCharm调试窗口显示该对象的类型为PySide2.QtSerialPort.QSerialPort.DataBits,并非普通Python枚举类。
手动实现这类嵌套类型的两种方式
这类结构本质是Qt的命名空间嵌套枚举,PySide2通过绑定工具自动生成对应结构,手动实现可以用以下两种方式模拟:
1. 用Python原生enum.Enum嵌套模拟
通过在外层类中嵌套枚举类,实现语法上一致的调用方式:
from enum import Enum class QSerialPort: class DataBits(Enum): Data5 = 0 Data6 = 1 Data7 = 2 Data8 = 3 # 调用方式和Qt的完全一致 obj_databits = QSerialPort.Data8 print(obj_databits) # 输出:QSerialPort.DataBits.Data8
这种方式是纯Python原生实现,行为和标准枚举一致,但底层实现和Qt生成的类型不同,仅语法对齐。
2. 用类属性模拟Qt风格的整数常量枚举
如果需要更贴近Qt枚举的表现(比如打印输出为整数),可以直接用嵌套类+类属性的方式定义:
class QSerialPort: class DataBits: Data5 = 0 Data6 = 1 Data7 = 2 Data8 = 3 # 调用方式相同 obj_databits = QSerialPort.Data8 print(obj_databits) # 输出:3
这种方式更接近你看到的Qt枚举的实际表现,因为Qt的很多枚举在Python绑定中会直接映射为整数常量,嵌套在类命名空间下。
补充说明
PySide2中的Qt枚举是通过Shiboken(Qt到Python的绑定工具)自动生成的,对应的C源码里是enum class或者命名空间枚举,所以你找不到纯Python的源码。如果想了解底层定义,可以去Qt官方仓库查看QSerialPort的C头文件,里面明确定义了DataBits枚举。
内容的提问来源于stack exchange,提问作者alaska lucky
相关产品推荐
相关产品推荐

