2024-06-28 15:38:31 发布
网友
在PySide中,我可以通过使用values属性来获得包含可能/允许的枚举数值及其字符串表示形式的字典。例如: QtWidgets.QMessageBox.StandardButton.values.items()。如何在PyQt4/PyQt5中实现相同的目标?有可能吗?我在文件里找不到这方面的资料。在
values
QtWidgets.QMessageBox.StandardButton.values.items()
PySide有一个内置的枚举类型(Shiboken.EnumType),它支持对名称/值进行迭代。{也可以直接从其属性cd2>中获取它的值。在
Shiboken.EnumType
不幸的是,PyQt从来没有这些特性,所以您必须推出自己的解决方案。很容易使用QMetaType来实现这一点,但是有些类没有必要的staticMetaObject。特别是,Qt名称空间没有,这就排除了将QMetaType用于非常大的枚举组的可能性。在
QMetaType
staticMetaObject
Qt
因此,更一般的解决方案是使用python的dir函数来构建双向映射,如下所示:
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)
输出:
PySide有一个内置的枚举类型(
Shiboken.EnumType
),它支持对名称/值进行迭代。{也可以直接从其属性cd2>中获取它的值。在不幸的是,PyQt从来没有这些特性,所以您必须推出自己的解决方案。很容易使用
QMetaType
来实现这一点,但是有些类没有必要的staticMetaObject
。特别是,Qt
名称空间没有,这就排除了将QMetaType
用于非常大的枚举组的可能性。在因此,更一般的解决方案是使用python的
dir
函数来构建双向映射,如下所示:输出:
^{pr2}$相关问题 更多 >
编程相关推荐