1
在PySide中,我可以通過使用values
屬性來獲得帶有可能的/允許的枚舉數值及其字符串表示的字典。例如: QtWidgets.QMessageBox.StandardButton.values.items()
。如何在PyQt4/PyQt5中實現相同?這甚至有可能嗎?在文檔中我沒有發現任何關於此的信息。PyQt允許枚舉值和字符串
在PySide中,我可以通過使用values
屬性來獲得帶有可能的/允許的枚舉數值及其字符串表示的字典。例如: QtWidgets.QMessageBox.StandardButton.values.items()
。如何在PyQt4/PyQt5中實現相同?這甚至有可能嗎?在文檔中我沒有發現任何關於此的信息。PyQt允許枚舉值和字符串
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