模型中 dropActions 的访问值 (PySide/PyQt/Qt)

Posted

技术标签:

【中文标题】模型中 dropActions 的访问值 (PySide/PyQt/Qt)【英文标题】:Access values of dropActions in model (PySide/PyQt/Qt) 【发布时间】:2014-10-12 02:54:11 【问题描述】:

在 QTableModel 中当我输入以下内容时:

print model.supportedDropActions()

我刚刚得到:

<PyQt4.QtCore.DropActions object at 0x00000000081172E8>

如何从该对象访问支持的放置操作的实际列表?在the documentation,它说,“DropActions 类型是 QFlags 的 typedef。它存储 DropAction 值的 OR 组合。”

请注意,我在 Python (PySide) 中执行此操作。

相关帖子:

Drag and drop rows within QTableWidget

【问题讨论】:

正如文档所说,它只是将值组合在一起,因此将其转换为 int。 @ekhumoro 对,所以它就像任何其他标志一样,不是吗?好的,我可以使用它。我感到困惑的一件事是它们似乎被编码为十六进制(qt-project.org/doc/qt-4.8/qt.html#DropAction-enum)。为什么文档中的某些枚举整数以十六进制表示,而其他枚举整数则以标准十进制表示?有关系吗?我的预感是这无关紧要,因为当您执行按位或/和时,它们都以二进制形式进行比较。但如果是这样的话,为什么文档不只使用一个约定呢? 我不确定,但我猜想十六进制的应该是 OR'd 在一起,而其他的只是不透明的枚举值。 是的,看起来文档中值的格式并没有真正的一致性。但是,在明确说明这些值是否旨在 OR'd 在一起似乎确实存在一致性。但是,具体的值是严格无关的:只有常量 names 真正重要。 C++ 枚举的值总是某种整数类型,所以总是可能对它们执行按位运算。但是无法从枚举类型或实际值中判断它们是否可以有用 OR'd 在一起 - 你只需要阅读文档。 PS:在PyQt中,枚举是python的int类型的子类。 【参考方案1】:

背景

首先,请确保您了解按位编码对这些标志的工作原理。这里接受的答案中有很好的描述:

What are bitwise operators? How to find specific Qt.ItemFlag occurrence into custom Qt.ItemFlags instance in PyQt?

每个使用 Qt 及其相关产品的人都应该阅读它们,如果您想从按位编码的值中提取信息,它们会省去很多麻烦。

解决方案

虽然以下不是针对删除操作,而是针对项目数据角色,但原理完全相同。如原帖中的 cmets 所述,您可以将编码值重新转换为 int,然后使用 Qt 在线提供的枚举(即整数和角色之间的转换)将其解码为人类可读的格式。我不知道为什么有时文档将整数表示为十六进制而不是小数。

在接下来的内容中,我在字典中表示the enumeration that I found online,其中int 作为键,人类可读的字符串描述作为值。然后使用将角色转换为int 的函数使用该字典进行翻译。

#Create a dictionary of all data roles
dataRoles = 0: 'DisplayRole', 1: 'DecorationRole', 2: 'EditRole', 3: 'ToolTipRole',\
            4: 'StatusTipRole', 5: 'WhatsThisRole', 6: 'FontRole', 7: 'TextAlignmentRole',\
            8: 'BackgroundRole', 9: 'ForegroundRole', 10: 'CheckStateRole', 13: 'SizeHintRole',\
            14: 'InitialSortOrderRole', 32: 'UserRole' 

#Return role in a human-readable format
def roleToString(flagDict, role):
    recastRole = int(role)  #recast role as int
    roleDescription = flagDict[recastRole]
    return roleDescription

然后使用它,例如在一个角色被抛出的模型中,我想看看在做什么:

print "Current data role: ", roleToString(dataRoles, role)

有不同的方法可以做到这一点,但我发现这非常直观且易于使用。

【讨论】:

以上是关于模型中 dropActions 的访问值 (PySide/PyQt/Qt)的主要内容,如果未能解决你的问题,请参考以下文章

PyS60-图库缩略图版本。2

POST 请求后在 swift 模型中访问值的问题

为自定义控件实现值访问器时,未从事件中的模型获取更新值

解密模型值的访问器不起作用

如何使用 Python 从 Vertex AI 上的训练模型访问特征重要性的文本数据(值)

移动开发进入壁垒