2011-12-28 4 views
1

PyFideのQFileをサブクラス化してカスタム読み込み動作を実装しようとしています。しかし、以下の単純化されたコードに見られるように、サブクラスのreadData実装が単に親のreadData関数を呼び出す場合でも、返されるデータは正しくありません。 QBufferなどの他のQIODeviceをサブクラス化すると、不正な戻り値も発生します。誰もQIODeviceを正常にサブクラス化しましたか?QIODeviceサブクラスのreadDataをオーバーライドすると不正な結果が返される

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') 
+0

Qtの元のC++バージョンでは、readDataは、データがchar配列に読み込まれ、長さが返される次の署名 'qint64 QIODevice :: readData(char * data、qint64 maxSize)'を持ちます。 PySideとPyQtでは、読み込まれたデータは文字列で直接返されます。この矛盾はそれと関係がありますか? – Narcolei

+1

これはPyQt4(PyQt4:4.8.6、Qt:4.7.4)で期待どおりに動作します。おそらくPySideのバグでしょうか? – Avaris

答えて

2

私は/ Qtの4.8.0のPython 2.7.2でPyQtは4.8とPyQtは4.9を使用してスクリプトをテストし、両方のケースでは、次の出力を生成します。

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

のでreadDataリターンバイト文字列は、PyQt4 docsに従います。 Pythonの2.7.2/Qtの4.8.0と1.0.9 PySideを使用

、私はこの出力を得る:PyQt4とPySide間の戻り値の型に差があるが、そこにある理由

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

わかりませんはっきりとPySideの何らかのバグです。

バグレポートhereが多少関連しているようですが、特に最近のことではありません(PySide 1.0.7)。

+0

このバグが存在するのは本当に悪いです。私はむしろPySideを使用しますが、選択肢がないようです。 – Narcolei

1

PySideのバグはshibokenのものです。qint64はオフセットタイプとしてqIODeviceで使用されますが、qint64はPython 2.xでは "long"ではなく "int"にマップされます。 qint64の値がqint32より大きい場合、その値を読み取ると、Python 2.xはOverflowErrorをスローします。 Qt64をSlot/Signal/Propertyまたは何らかのQtメタタイプとして使用してQt C++コードをPythonと通信すると、同様のオーバーフローエラーが発生します。

この問題を回避するソリューションも探しています。

0

Qt5とPySide2でも有効です。私たちは調査中です。

関連する問題