[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