[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