[PyQt] Subclassing QNetworkReply

Detlev Offenbach detlev at die-offenbachs.de
Mon Mar 2 19:37:55 GMT 2009


On Montag, 2. März 2009, Phil Thompson wrote:
> 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.

That fixed it. I applied it to PyQt 4.4.4.

Detlev
-- 
Detlev Offenbach
detlev at die-offenbachs.de



More information about the PyQt mailing list