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

3
在 QTableModel 中,当我输入以下内容时:
print model.supportedDropActions()

我只是得到:
<PyQt4.QtCore.DropActions object at 0x00000000081172E8>

我怎样才能从这个对象中访问支持的拖放操作列表?在文档中,它说,“DropActions类型是QFlags的typedef。它存储了DropAction值的OR组合。”请注意,我是用Python(PySide)实现的。
相关帖子:

@ekhumoro 对,所以它就像任何其他标志一样,对吧?好的,我可以处理。有一件事让我困惑,它们似乎被编码为十六进制(qt-project.org/doc/qt-4.8/qt.html#DropAction-enum)。为什么文档中有些枚举整数用十六进制表示,而另一些用标准十进制表示?这有关系吗?我的直觉是它不应该有关系,因为当你执行按位或/与运算时,它们都是以二进制进行比较的。但如果是这样,为什么文档不只使用一个约定呢? - eric
1
我不能确定,但我猜测十六进制的值是用来进行位或运算,而其他的则只是不透明的枚举值。 - ekhumoro
@ekhumoro 很遗憾,它不可能是那样的。我一直在使用itemFlag作为我理解Qt如何处理位掩码的基础,而itemFlag使用整数(qt-project.org/doc/qt-4.8/qt.html#ItemFlag-enum),并支持相同的OR运算(“ItemFlags类型是QFlags<ItemFlag>的typedef。它存储ItemFlag值的OR组合。”)。难以解释的差异?确实,如果您浏览Qt命名空间(http://qt-project.org/doc/qt-4.8/qt.html#details),似乎随机描述标志是十进制还是十六进制。 - eric
1
是的,看起来文档中的值格式没有真正的一致性。然而,在明确说明这些值是否打算进行OR运算方面似乎存在一致性。具体的值严格来说并不重要,只有常量名称才真正重要。C++枚举的值将始终是某种整数类型,因此始终可以对它们执行按位操作。但是,无法从枚举类型或其实际值中确定它们是否可以被有用地 OR在一起-您只需要阅读文档。 - ekhumoro
1
在PyQt中,枚举是Python int类型的子类。 - ekhumoro
显示剩余2条评论
1个回答

2

背景

首先,确保您了解这些标志的按位编码方式。在这里的已接受答案中有非常好的描述:

每个使用Qt及其相关工具的人都应该阅读它们,如果你想从按位编码的值中提取信息,它们将节省很多麻烦。

解决方案

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

在下面的内容中,我使用字典表示了我在网上找到的枚举,其中将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)

有不同的方法可以做到这一点,但我觉得这个方法非常直观和易于使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接