[PyQt] How do I subclass QTextEdit without warnings on close?

Brad Ralph lists at ralph.id.au
Tue May 3 03:49:24 BST 2011


Hi Pete,

Thanks for you reply but I don't understand what you are suggesting as a 
solution. I tried to take you at your suggestion and replace the line 
'def  focusOutEvent(self, e):' with 'QtGui.QTextEdit.focusOutEvent(self, e)'
but it did not work. (Invalid syntax error). I even tried variations like 'def 
QtGui.QTextEdit.focusOutEvent(self, e)' just in case I was stupidly not 
understanding you.

I also experimented with my real application instead of the test app I 
included in my email.  From my understanding of your diagnosis, if the event 
does not get time to finish before the program ends, then I should be able to 
enter into a different widget (which fires the event) then wait for a few 
seconds (even 5 mins) for it to finish, before closing the program.  When I do 
this the error still occurs, but only if I fire the event by entering into the 
QTextEdit subclass.  This leads me to think that I have no clue what is going 
on.  How can the event not finish when several seconds have passed after it was 
fired? 

I also wonder what is the correct way to subclass a Qt4 widget in this case.I 
have been using the method in PyQt3 and it has always worked, so I guess I 
need to do it differently now.

I also would like to know why you suggest using Super()?  I seem to remember  
that there were warnings in the PyQt docs that using it in certain cases could 
cause problems, so I've always avoided it.  I also tend to think that it 
breaks the 'explicit is better than implicit rule' but that is just an 
opinion.

Thanks in advance for your help.

Regards,
Brad

On Mon, 2 May 2011 11:36:44 PM Hans-Peter Jansen wrote:

[snip ...]

> > 
> > ########################################
> > 
> > #!/bin/env python
> > # -*- coding: utf-8 -*-
> > import sys
> > from PyQt4 import QtCore, QtGui
> > 
> > try:
> >     _fromUtf8 = QtCore.QString.fromUtf8
> > 
> > except AttributeError:
> >     _fromUtf8 = lambda s: s
> > 
> > class MyQTextEdit(QtGui.QTextEdit):
> >     textEdited = QtCore.pyqtSignal('QString')
> >     
> >     def __init__(self, *args):
> >         QtGui.QTextEdit.__init__(self, *args)
> >     
> >     def  focusOutEvent(self, e):
> >         val = self.toHtml()
> >         self.textEdited.emit(val)
> 
> The dtor of QTextEdit is called before the event finished.
> 
> Try this:
> 
> 	  QtGui.QTextEdit.focusOutEvent(self, e)
> 
> You might want to switch to super() for calling into the base classes,
> though.
> 
> > class frmTest(QtGui.QMainWindow):
> >     def __init__(self, app, *args):
> >         QtGui.QMainWindow.__init__(self, *args)
> >         self.app = app
> >         self.mainWidget = QtGui.QFrame()
> >         self.setCentralWidget(self.mainWidget)
> >         self.fmeLayout = QtGui.QVBoxLayout(self.mainWidget)
> >         self.teDesc1 = MyQTextEdit(self.mainWidget)
> >         self.teDesc1.setObjectName(_fromUtf8("teDesc1"))
> >         self.fmeLayout.addWidget(self.teDesc1)
> >         self.teDesc2 = MyQTextEdit(self.mainWidget)
> >         self.teDesc2.setObjectName(_fromUtf8("teDesc1"))
> >         self.fmeLayout.addWidget(self.teDesc2)
> > 
> > if "__main__"==__name__:
> >     qapp = QtGui.QApplication(sys.argv)
> >     view = frmTest(qapp)
> >     view.show()
> >     qapp.exec_()
> 
> Cheers,
> Pete
> 
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> http://www.riverbankcomputing.com/mailman/listinfo/pyqt


More information about the PyQt mailing list