PyQt преобразование mimeData в строку: как удалить некоторые пробелы, но не все? - PullRequest
1 голос
/ 23 декабря 2011

Я преобразую объект 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

Как я могу получить Johnny Depp из mimeData вместо JohnnyDepp или J o h n n y D e p p?

Ответы [ 3 ]

0 голосов
/ 23 декабря 2011

Похоже, что между каждым символом ставятся двойные пробелы. Обратите внимание на тройной пробел между буквой «у» и буквой «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'

Я думаю, что последний должен вернуть то, что вы ищете, сначала удалив двойные пробелы.

0 голосов
/ 23 декабря 2011

Данные 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

Результат в форме дикта, содержащего диктанты для каждого столбца отброшенного предмета. В столбце содержатся данные для каждой представленной роли.

Таким образом, чтобы получить текст из нулевого столбца, вы должны сделать:

format = 'application/x-qabstractitemmodeldatalist'
data = event.mimeData().data(format)
item = self.decodeMimeData(data)
print item[0][QtCore.Qt.DisplayRole]
0 голосов
/ 23 декабря 2011

Полагаю, вы могли бы использовать что-то вроде этого:

>>> re.sub('\W+', ' ', 'some space   here')
'some space here'

Это заменит каждый кусок пробела одним пробелом.

Также см. Здесь: Простой способ удалить несколько пробелов в строке в Python

...