On Montag, 2. März 2009, Phil Thompson wrote: > On Mon, 2 Mar 2009 18:33:01 +0100, Detlev Offenbach > > <det...@die-offenbachs.de> wrote: > > On Montag, 2. März 2009, Phil Thompson wrote: > >> On Mon, 2 Mar 2009 18:19:57 +0100, Detlev Offenbach > >> > >> <det...@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@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) --------------- Regards, Detlev -- Detlev Offenbach det...@die-offenbachs.de _______________________________________________ PyQt mailing list PyQt@riverbankcomputing.com http://www.riverbankcomputing.com/mailman/listinfo/pyqt