Переопределение readData в подклассе QIODevice возвращает неверный результат - PullRequest
1 голос
/ 28 декабря 2011

Я пытаюсь создать подкласс QFile в PySide для реализации пользовательского поведения чтения.Однако, как видно из приведенного ниже упрощенного кода, даже если реализация readData подкласса просто вызывает функцию readData родительского элемента, возвращаемые данные неверны.Подклассы других QIODevices, таких как QBuffer, также вызывают неправильные возвращаемые значения.Кто-нибудь успешно прошел подкласс QIODevice?

from PySide import QtCore

class FileChild1(QtCore.QFile):
    pass

class FileChild2(QtCore.QFile):
    def readData(self, maxlen):
        return super(FileChild2, self).readData(maxlen)


f1 = FileChild1('test.txt')
f1.open(QtCore.QIODevice.ReadWrite|QtCore.QIODevice.Truncate)
f1.write('Test text for testing')
f1.seek(0)
print 'FileChild1: ', repr(f1.read(50))

f2 = FileChild2('test2.txt')
f2.open(QtCore.QIODevice.ReadWrite|QtCore.QIODevice.Truncate)
f2.write('Test text for testing')
f2.seek(0)
print 'FileChild2: ', repr(f2.read(50))

>>> FileChild1:  PySide.QtCore.QByteArray('Test text for testing')
>>> FileChild2:  PySide.QtCore.QByteArray('─ Q ►│A☻ @  p¼a☻Test text for testing\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00')

Ответы [ 3 ]

2 голосов
/ 28 декабря 2011

Я протестировал ваш скрипт с PyQt 4.8 и PyQt 4.9 с Python 2.7.2 / Qt 4.8.0, и в обоих случаях он выдает следующий вывод:

FileChild1:  'Test text for testing'
FileChild2:  'Test text for testing'

Таким образом, readData возвращает байтовую строку согласно PyQt4 документам .

Используя PySide 1.0.9 с Python 2.7.2 / Qt 4.8.0, я получаю следующий вывод:

FileChild1:  PySide.QtCore.QByteArray('Test text for testing')
FileChild2:  PySide.QtCore.QByteArray('')

Не уверен, почему существует разница в типе возврата между PyQt4 и PySide, но в PySide явно есть какая-то ошибка.

Здесь имеется сообщение об ошибке здесь , которое выглядит так, как будто оно может быть несколько связано, но это не особенно недавно (PySide 1.0.7).

1 голос
/ 27 декабря 2012

Ошибка PySide от shiboken: qint64 используется в QIODevice в качестве типа смещения, но qint64 отображается в «int» в Python 2.x, а не «long».Когда значение qint64 больше, чем qint32, чтение этого значения приведет к тому, что Python 2.x вызовет OverflowError.Подобная ошибка OverflowError возникает при использовании qint64 в качестве Slot / Signal / Property или любых мета-типов Qt для передачи кода Qt C ++ с Python.

Я также ищу решение, чтобы обойти эту проблему.

0 голосов
/ 11 февраля 2017

Очень актуально для Qt5 и PySide2.Мы расследуем.

...