PyQt允许枚举值和字符串

2024-06-28 14:59:06 发布

您现在位置:Python中文网/ 问答频道 /正文

在PySide中,我可以通过使用values属性获取具有可能/允许的枚举数值及其字符串表示形式的字典。例如: QtWidgets.QMessageBox.StandardButton.values.items()。如何在PyQt4/PyQt5中实现相同的功能?这可能吗?我在文件里找不到这方面的信息


Tags: 文件字符串功能字典属性itemspyqt5形式
1条回答
网友
1楼 · 发布于 2024-06-28 14:59:06

PySide有一个内置的枚举类型(Shiboken.EnumType),它支持对名称/值进行迭代。它还支持name属性,您可以使用该属性直接从其值获取枚举器名称

不幸的是,PyQt从来没有这些特性,因此您必须推出自己的解决方案。使用QMetaType来实现这一点很有诱惑力,但是有些类没有必要的staticMetaObject。特别是,Qt名称空间没有名称空间,这排除了对非常大的枚举组使用QMetaType

因此,更通用的解决方案是使用python的dir函数来构建双向映射,如下所示:

def enum_mapping(cls, enum):
    mapping = {}
    for key in dir(cls):
        value = getattr(cls, key)
        if isinstance(value, enum):
            mapping[key] = value
            mapping[value] = key
    return mapping

enum = enum_mapping(QMessageBox, QMessageBox.StandardButton)

print('Ok = %s' % enum['Ok'])
print('QMessageBox.Ok = %s' % enum[QMessageBox.Ok])
print('1024 = %s' % enum[1024])
print()

for item in sorted(enum.items(), key=str):
    print('%s = %s' % item)

输出:

Ok = 1024
QMessageBox.Ok = Ok
1024 = Ok

Abort = 262144
Apply = 33554432
ButtonMask = -769
Cancel = 4194304
Close = 2097152
Default = 256
Discard = 8388608
Escape = 512
FirstButton = 1024
FlagMask = 768
Help = 16777216
Ignore = 1048576
LastButton = 134217728
No = 65536
NoAll = 131072
NoButton = 0
NoToAll = 131072
Ok = 1024
Open = 8192
Reset = 67108864
RestoreDefaults = 134217728
Retry = 524288
Save = 2048
SaveAll = 4096
Yes = 16384
YesAll = 32768
YesToAll = 32768
-769 = ButtonMask
0 = NoButton
1024 = Ok
1048576 = Ignore
131072 = NoToAll
134217728 = RestoreDefaults
16384 = Yes
16777216 = Help
2048 = Save
2097152 = Close
256 = Default
262144 = Abort
32768 = YesToAll
33554432 = Apply
4096 = SaveAll
4194304 = Cancel
512 = Escape
524288 = Retry
65536 = No
67108864 = Reset
768 = FlagMask
8192 = Open
8388608 = Discard

相关问题 更多 >