You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何理解并手动定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:15:06