[PyQt] Subclassing QNetworkReply
Phil Thompson
phil at riverbankcomputing.com
Mon Mar 2 18:56:27 GMT 2009
On Mon, 2 Mar 2009 19:31:26 +0100, Detlev Offenbach
<detlev at die-offenbachs.de> wrote:
> On Montag, 2. März 2009, Phil Thompson wrote:
>> On Mon, 2 Mar 2009 18:33:01 +0100, Detlev Offenbach
>>
>> <detlev at die-offenbachs.de> wrote:
>> > On Montag, 2. März 2009, Phil Thompson wrote:
>> >> On Mon, 2 Mar 2009 18:19:57 +0100, Detlev Offenbach
>> >>
>> >> <detlev at die-offenbachs.de> wrote:
>> >> > Hi,
>> >> >
>> >> > I am trying to write a subclass of QNetworkReply. This subclass
>> >> > needs
>> >> > to
>> >> > have
>> >> > it's own variant of the readData protected method. However, it
>> >> > seems,
>> >>
>> >> that
>> >>
>> >> > this method doesn't work correctly. How do I have to do this
>>
>> correctly.
>>
>> >> My
>> >>
>> >> > code is shown below.
>> >> >
>> >> > --------------
>> >> > class HelpNetworkReply(QNetworkReply):
>> >> > def __init__(self, request, fileData):
>> >> > QNetworkReply.__init__(self)
>> >> >
>> >> > self.__data = QBuffer(fileData)
>> >> >
>> >> > self.setRequest(request)
>> >> > self.setOpenMode(QIODevice.ReadOnly)
>> >> >
>> >> > self.setHeader(QNetworkRequest.ContentTypeHeader,
>> >> > QVariant("text/html"))
>> >> > self.setHeader(QNetworkRequest.ContentLengthHeader,
>> >> >
QVariant(QByteArray.number(fileData.length())))
>> >> > QTimer.singleShot(0, self, SIGNAL("metaDataChanged()"))
>> >> > QTimer.singleShot(0, self, SIGNAL("readyRead()"))
>> >> >
>> >> > def abort(self):
>> >> > # do nothing
>> >> > pass
>> >> >
>> >> > def readData(self, buffer, maxlen):
>> >> > l = self.__data.readData(buffer, maxlen)
>> >> > if self.__data.bytesAvailable() == 0:
>> >> > QTimer.singleShot(0, self, SIGNAL("finished()"))
>> >> > return l
>> >> > --------------
>> >>
>> >> The Python signature is slightly different as Python strings aren't
>> >> mutable. There is no buffer argument and you should return the data
as
>> >> a
>> >> Python string.
>> >>
>> >> Phil
>> >> _______________________________________________
>> >> PyQt mailing list PyQt at riverbankcomputing.com
>> >> http://www.riverbankcomputing.com/mailman/listinfo/pyqt
>> >
>> > So I have to "return l, buffer" with buffer being a Python string.
>>
>> No, just buffer. The handwritten code for readData() gets the length
from
>> the buffer.
>
> That works now. However, I am facing a new problem. After several
requests
> with a "qthelp" scheme, my application is crashing with a segfault. If I
> keep
> the references to the reply objects (i.e. never clean the array), it
works
> (but leaks memory). What is wrong?
>
> Note: engine is a reference to a QHelpEngine object.
>
> ---------------
> class HelpNetworkAccessManager(QNetworkAccessManager):
> def __init__(self, engine, parent = None):
> QNetworkAccessManager.__init__(self, parent)
>
> self.__engine = engine
> self.__helpreplies = []
>
> def createRequest(self, op, request, outgoingData):
> for reply in self.__helpreplies[:]:
> if reply.isFinished():
> self.__helpreplies.remove(reply)
> del reply
>
> scheme = request.url().scheme()
> if scheme == "qthelp":
> reply = HelpNetworkReply(request,
> self.__engine.fileData(request.url()))
> self.__helpreplies.append(reply)
> print len(self.__helpreplies)
> return reply
>
> return QNetworkAccessManager.createRequest(self, op, request,
> outgoingData)
> ---------------
Possibly a missing /Factory/ on QNetworkAccessManager.createRequest(). Can
you add it and see if it makes a difference - or send me a complete test
that demonstrates the problem.
Phil
More information about the PyQt
mailing list