假设我有一个python枚举:
class UserState(Enum):
OFFLINE = auto()
ONLINE = auto()
BUSY = auto()
我可以使用UserState.ONLINE
、UserState.OFFLINE
或UserState.BUSY
访问不同的选项。如果我想把它变成QEnum以便在QML中使用它,我需要把它 Package 在QObject
中,如下所示:
class UserState(QObject):
@QEnum
class Options(Enum):
OFFLINE = auto()
ONLINE = auto()
BUSY = auto()
在QML中,我可以像在python中访问普通的python枚举一样访问这个枚举,但是如果我想从python访问这个枚举,我必须写UserState.Options.ONLINE
。
我怎样才能创建一个枚举,它可以使用相同的语法在python和QML中工作?
- 我已经找到了一个解决方案,我将在答案部分发布。但是它涉及到嵌套的元类,这看起来不太对。我认为最佳的解决方案是一个从QObject和Enum派生的类,它具有每个上下文的所有功能。*
- 如果有人能提供一个这样的版本,我会把它作为公认的答案。否则,你可以告诉我,为什么我的解决方案实际上是一个好的。*
2条答案
按热度按时间2ul0zpep1#
下面是我写的一个类,它增加了我在这个问题中所要求的支持:
CustomEnum类可以像普通的python枚举一样继承:
现在你可以像在QML中一样在python中使用
UserState
,这是一个对python和QML都有效的语句:UserState.ONLINE
我的实现工作原理是用一个QObject替换原来的类,嵌套原来的类,然后把嵌套类的所有属性复制到外部类,使它们可以从python访问。
hgc7kmma2#
您可以只在类内部调用QEnum并在类外部定义枚举。
示例(PySide6):
文件:main.py
文件:主.qml
完整代码here