2016-09-24 152 views
1

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

回答

1

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