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