<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
  <title></title>
</head>
<body bgcolor="#ffffff" text="#000000">
Phil Thompson wrote:
<blockquote cite="mid:3c4effb486c6ee2be5bd360ae4411b7e@localhost"
 type="cite">
  <pre wrap="">On Mon, 02 Feb 2009 13:49:23 +0100, GT6 <a class="moz-txt-link-rfc2396E" href="mailto:gt6@gmx.net">&lt;gt6@gmx.net&gt;</a> wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">Phil Thompson wrote:
    </pre>
    <blockquote type="cite">
      <pre wrap="">On Mon, 02 Feb 2009 03:37:13 +0100, GT6 <a class="moz-txt-link-rfc2396E" href="mailto:gt6@gmx.net">&lt;gt6@gmx.net&gt;</a> wrote:
  
      </pre>
      <blockquote type="cite">
        <pre wrap="">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
        </pre>
      </blockquote>
    </blockquote>
  </blockquote>
  <pre wrap=""><!---->function
  </pre>
  <blockquote type="cite">
    <blockquote type="cite">
      <blockquote type="cite">
        <pre wrap="">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()
       
        </pre>
      </blockquote>
    </blockquote>
  </blockquote>
  <pre wrap=""><!---->newDoc.setDocumentLayout(QtGui.QPlainTextDocumentLayout(newDoc))
  </pre>
  <blockquote type="cite">
    <blockquote type="cite">
      <blockquote type="cite">
        <pre wrap="">        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()


        </pre>
      </blockquote>
    </blockquote>
  </blockquote>
  <pre wrap=""><!---->newDoc.setDocumentLayout(QtGui.QPlainTextDocumentLayout.__init__(newDoc))
  </pre>
  <blockquote type="cite">
    <blockquote type="cite">
      <blockquote type="cite">
        <pre wrap="">        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.
    
        </pre>
      </blockquote>
      <pre wrap="">__init__() initialises a class, it doesn't create one.

  
      </pre>
      <blockquote type="cite">
        <pre wrap="">So, does anyone have any idea why
this is happening? Do you have a bug tracker?
    
        </pre>
      </blockquote>
      <pre wrap="">Keep a reference to "newDoc" - it is getting garbage collected too soon.

Phil

  
      </pre>
    </blockquote>
    <pre wrap="">Thanks for your help.

Well, that only works once. So I replace the plzsegfault function in the 
sample with this (full sample binned here
    </pre>
  </blockquote>
  <pre wrap=""><!----><a class="moz-txt-link-freetext" href="http://rafb.net/p/P6sqML59.html">http://rafb.net/p/P6sqML59.html</a>):
  </pre>
  <blockquote type="cite">
    <pre wrap="">    def plzsegfault(self):
        self.newDoc = QtGui.QTextDocument()
        

    </pre>
  </blockquote>
  <pre wrap=""><!---->self.newDoc.setDocumentLayout(QtGui.QPlainTextDocumentLayout(self.newDoc)) 
  </pre>
  <blockquote type="cite">
    <pre wrap=""># 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...
    </pre>
  </blockquote>
  <pre wrap=""><!---->
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

  </pre>
</blockquote>
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: <a class="moz-txt-link-freetext" href="http://rafb.net/p/rW8qrv26.html">http://rafb.net/p/rW8qrv26.html</a><br>
<br>
The code is a bit messy, there are some obsolete things in there. In
any case, could you please try the following:<br>
<br>
1.) run the script<br>
2.) type something in a day field<br>
3.) click &gt;&gt;<br>
4.) click &lt;&lt;<br>
5.) Segfault!<br>
<br>
But on the other hand:<br>
<br>
1.) run the script<br>
2.) click &gt;&gt; <br>
3.) click &lt;&lt;<br>
4.) type something in a day field<br>
7.) No more segfaults. You can type anything anywhere and click
&gt;&gt; &lt;&lt; at any point and everything works asa exepected.<br>
<br>
So for some reason, doing &gt;&gt; &lt;&lt; before touching any of the
fields prevents the subsequent segfault, while typing something in a
day field right away results in a segfault. And I just don't understand
why.<br>
<br>
The script is made up from PyQalMain which is the main widget with all
the stuff and TextEditEnter which overwrites a few functions of
QPlainTextEdit and has the goFuture and goPast functions added. All the
day field contecnts are saved in PyQalMain.dayDict {} (line 131) which
is passed to all 7 day fields as an argument.<br>
<br>
I'd be so glad if someone would find out what's wrong here...<br>
<br>
Thanks,<br>
Carl.<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
</body>
</html>