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

Phil Thompson phil at riverbankcomputing.com
Mon Feb 2 15:40:34 GMT 2009


On Mon, 02 Feb 2009 16:27:51 +0100, GT6 <gt6 at gmx.net> wrote:
> Phil Thompson wrote:
>> On Mon, 02 Feb 2009 13:49:23 +0100, GT6 <gt6 at gmx.net> wrote:
>>   
>>> 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...
>>>     
>>
>> You might not but Python needs a reference of some sort to stop the
>> object
>> being garbage collected.
>>
>> Your new version is still garbage collecting too soon. Just add the
>> following to the end of plzsegfault() in your *original* version...
>>
>>     self._doc = newDoc
>>
>> Phil
>>
>>   
> It's still not working in my "real" application. I've been trying to 
> figure out what's wrong for hours now but it's just weird and I don't 
> understand it. Here's the complete code of what I'm doing. It's a small 
> calendar: http://rafb.net/p/rW8qrv26.html

That's got to be the dumbest pasting site I've ever seen. Why isn't there a
link to download a file?

> The code is a bit messy, there are some obsolete things in there. In any 
> case, could you please try the following:
> 
> 1.) run the script

I will if you send it to me as an attachment.

Phil


More information about the PyQt mailing list