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

Hans-Peter Jansen hpj at urpla.net
Mon May 2 14:36:44 BST 2011


On Monday 02 May 2011, 12:39:33 Brad Ralph wrote:
> Hello,
>
> I am trying to subclass QTextEdit to implement a foucsOutEvent.  I
> must be doing something wrong however because when I replace the
> standard QTextEdit with my subclass I get the following error mesages
> when I close the program. (once for each instance of my subclass). I
> don't when a reqular QTextEdit is used.
>
> Application asked to unregister timer 0x6000001 which is not
> registered in this thread. Fix application.
> Application asked to unregister timer 0x3d000002 which is not
> registered in this thread. Fix application.
>
> I running on Fedora 14 and my versions numbers are:
> Python: 2.7
> Qt: 4.7.2
> PyQt: 4.8.3
> sip: 4.12.1
>
> Can anyone tell me what I'm doing wrong?
>
> Below is a simple program to demonstrate my error:
>
> ########################################
>
> #!/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



More information about the PyQt mailing list