PyQt mimeData到字符串转换:如何消除一些空格,但不是所有空格?

时间:2011-12-22 21:15:10

标签: python pyqt pyqt4 mime-types

我将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 DeppJohnnyDepp中获取J o h n n y D e p p

3 个答案:

答案 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]