我将mimeData对象转换为人类可读的字符串,当它被放到另一个小部件上时。这一切都很好,除了轻微的间距问题。
以下是代码:
import re
event.accept()
format = "application/x-qabstractitemmodeldatalist"
data = event.mimeData().data(format)
pattern = re.compile('\W')
item = re.sub(pattern, '', str(data))
print str(data) # prints smiley face, other unicode characters, then J o h n n y D e p p
print item # prints JohnnyDepp
如何从mimeData而不是Johnny Depp
或JohnnyDepp
中获取J o h n n y D e p p
?
答案 0 :(得分:0)
我想你可以使用这样的东西:
>>> re.sub('\W+', ' ', 'some space here')
'some space here'
它会用一个空格替换每一块空白。
另见:A simple way to remove multiple spaces in a string in Python
答案 1 :(得分:0)
看起来每个角色之间都放置了双重空格。注意'y'和'D'之间的三重空间。
>>> line = "J o h n n y D e p p"
>>> re.sub('\W+', '', line)
'JohnnyDepp'
>>> re.sub('\W+', ' ', line)
'J o h n n y D e p p'
>>> re.sub('\W+', ' ', line.replace(' ', ''))
'Johnny Depp'
我认为最后一个应该通过首先删除双空格来返回你想要的东西。
答案 2 :(得分:0)
mime数据是QByteArray
,其中包含已删除项目的序列化表示。
所以你需要一个函数来解码数据,如下所示:
def decodeMimeData(self, data):
result = {}
value = QtCore.QVariant()
stream = QtCore.QDataStream(data)
while not stream.atEnd():
row = stream.readInt32()
col = stream.readInt32()
item = result.setdefault(col, {})
for role in range(stream.readInt32()):
key = QtCore.Qt.ItemDataRole(stream.readInt32())
stream >> value
item[key] = value.toPyObject()
return result
结果是dict形式,包含已删除项目的每列的dicts。列dicts包含所代表的每个角色的数据。
所以要从第0列获取文本,你可以这样做:
format = 'application/x-qabstractitemmodeldatalist'
data = event.mimeData().data(format)
item = self.decodeMimeData(data)
print item[0][QtCore.Qt.DisplayRole]