2016-09-24 1 views
1

PySide에서는 values 속성을 사용하여 가능한/허용 열거 자 값과 해당 문자열 표현으로 사전을 가져올 수 있습니다. 예 : QtWidgets.QMessageBox.StandardButton.values.items(). 어떻게 PyQt4/PyQt5에서 동일한 달성하기 위해? 그게 가능한가? 나는 이것에 대해 문서에서 아무것도 발견하지 못했다.PyQt는 열거 형 값과 문자열을 허용했습니다.

답변

1

PySide에는 이름/값에 대한 반복을 지원하는 내장 열거 형 (Shiboken.EnumType)이 있습니다. 또한 값에서 직접 열거 자 이름을 가져 오는 데 사용할 수있는 name 특성도 지원합니다.

불행히도 PyQt에는 이러한 기능이 없었기 때문에 자신 만의 솔루션을 사용해야합니다. 이 경우 QMetaType을 사용하기를 원하지만 일부 클래스는 필요하지 않습니다. staticMetaObject. 특히 Qt 네임 스페이스에는 매우 큰 그룹의 enum에 대해 QMetaType을 사용하지 않기로 한 네임 스페이스가 없습니다.

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 

그래서 더 일반적인 솔루션은 다음과 같이 양방향 매핑을 구축하는 파이썬의 dir 기능을 사용하는 것입니다