[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