[PyQt] Segfault when trying newDoc.setDocumentLayout(QtGui.QPlainTextDocumentLayout(newDoc))

GT6 gt6 at gmx.net
Mon Feb 2 12:49:23 GMT 2009


Phil Thompson wrote:
> On Mon, 02 Feb 2009 03:37:13 +0100, GT6 <gt6 at gmx.net> wrote:
>   
>> Hi there.
>>
>> When running the below sample script, and clicking the button, it will
>> segfault, and I don't understand why or how. I've overwritten a function
>> in QPlainTextEdit and it should create a new document, set the
>> PlainTextDocumentLayout and then set the document on the QPlainTextEdit
>> widget. The important part is this (1st way):
>>
>>         newDoc = QtGui.QTextDocument()
>>         newDoc.setDocumentLayout(QtGui.QPlainTextDocumentLayout(newDoc))
>>         self.setDocument(newDoc)
>>
>> The above segfaults. I also tried this (2nd way):
>>
>>             newDoc = QtGui.QTextDocument()
>>             newDoc.setDocumentLayout(self.documentLayout())
>>             self.setDocument(newDoc)
>>
>> This one doesn't segfault, but I get this error:
>>
>> AttributeError: documentLayout
>>
>> Apart from that, I tried this third option (3rd way):
>>
>>         newDoc = QtGui.QTextDocument()
>>
>> newDoc.setDocumentLayout(QtGui.QPlainTextDocumentLayout.__init__(newDoc))
>>         self.setDocument(newDoc)
>>
>> with the only difference from the first one being that __init__ is
>> called explicitly instead of expecting it to be defaultet. This one
>> _doesn't_ segfault, but gives this error:
>>
>> QPlainTextEdit::setDocument: Document set does not support
>> QPlainTextDocumentLayout
>>
>> Which makes no sense as not calling __init__ directly shouldn't be any
>> different than calling it explicitly.
>>     
>
> __init__() initialises a class, it doesn't create one.
>
>   
>> So, does anyone have any idea why
>> this is happening? Do you have a bug tracker?
>>     
>
> Keep a reference to "newDoc" - it is getting garbage collected too soon.
>
> Phil
>
>   
Thanks for your help.

Well, that only works once. So I replace the plzsegfault function in the 
sample with this (full sample binned here http://rafb.net/p/P6sqML59.html):

    def plzsegfault(self):
        self.newDoc = QtGui.QTextDocument()
        
self.newDoc.setDocumentLayout(QtGui.QPlainTextDocumentLayout(self.newDoc)) 
# First way
        self.setDocument(self.newDoc)

Then, I can safely click the button once, and it also does what I expect 
it to do, but clicking the button a second time will again segfault.
What I'm trying to do is that clicking the button will clear the 
textfield and make a new document and display it. Do I really have to 
care about the document names? I *could* implement a counter and have 
all the documents have different names but I don't really need those 
specific names in the future. I just need the textfield to discard the 
old one and get a new one, everytime the button is clicked. The only 
reference to the document that I use lateron is self.document(). I don't 
need the name...



-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.riverbankcomputing.com/pipermail/pyqt/attachments/20090202/dec1c29c/attachment.html


More information about the PyQt mailing list