[PyQt] QWidget focusInEvent() ?

Mark Summerfield mark at qtrac.eu
Thu May 29 17:30:10 BST 2008

On 2008-05-29, B Clowers wrote:
> I have what would seem to be a fairly small problem.  My
> application has a main window that currently has the ability to spawn
> a number of Non-Modal QWidgets in their own respective windows. 
> I need to emit or catch a signal that is produced whenever a
> particular QWidget in its own window gets the focus.  After
> looking at the documentation I can't seem to find a particular signal
> that is emitted.  Does anyone have an idea how to accomplish this
> task?

It isn't quite so simple because focus is not a high level abstract
behaviour which signals and slots are for, but a low level detail. So
I think you'll have to use the event handling mechanism.

Here's something that works for me on Linux, i.e., if I run it as soon
as it appears it prints "got the focus", then if I Alt+Tab to another
window and then back it prints it again:

import sys
from PyQt4 import QtGui, QtCore

class EventFilter(QtCore.QObject):

    def __init__(self, parent=None):
	QtCore.QObject.__init__(self, parent)

    def eventFilter(self, obj, event):
	if event.type() == QtCore.QEvent.ActivationChange:
	    if self.parent().isActiveWindow():
		print "got the focus"
	return QtCore.QObject.eventFilter(self, obj, event)

class TestWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)


        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Test Widget')

        quit = QtGui.QPushButton('Close', self)
        quit.setGeometry(10, 10, 60, 35)

        self.connect(quit, QtCore.SIGNAL('clicked()'),
            QtGui.qApp, QtCore.SLOT('quit()'))
if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    tw = TestWidget()

Mark Summerfield, Qtrac Ltd., www.qtrac.eu

More information about the PyQt mailing list