[PyQt] Hijacking QtCore.connect, disconnect and emit

Carlos Scheidegger cscheid at sci.utah.edu
Thu Jul 12 22:40:49 BST 2007


Hello,

	I am a developer of a largish (~75kloc) application that uses PyQt, and I'm
trying to track down a bug that might be related to signal handling. I was
hoping to be able to track down every signal that is emitted, even if that
makes everything superslow while debugging. I have managed to hijack PyQt's
connect and disconnect calls by a seriously horrible hack:

_oldConnect = QtCore.QObject.connect
_oldDisconnect = QtCore.QObject.disconnect

def _wrapConnect(callableObject):
    """Returns a wrapped call to the old version of QtCore.QObject.connect"""
    @staticmethod
    def call(*args):
        callableObject(*args)
        _oldConnect(*args)
    return call

def _wrapDisconnect(callableObject):
    """Returns a wrapped call to the old version of QtCore.QObject.disconnect"""
    @staticmethod
    def call(*args):
        callableObject(*args)
        _oldDisconnect(*args)
    return call

def enableSignalDebugging(**kwargs):
    """Call this to enable Qt Signal debugging. This will trap all
    connect, and disconnect calls."""

    f = lambda *args: None
    connectCall = kwargs.get('connectCall', f)
    disconnectCall = kwargs.get('disconnectCall', f)
    emitCall = kwargs.get('emitCall', f)

    def printIt(msg):
        def call(*args):
            print msg, args
        return call
    QtCore.QObject.connect = _wrapConnect(connectCall)
    QtCore.QObject.disconnect = _wrapDisconnect(disconnectCall)

Strangely enough, this works. However, the direct extension of the trick to
QtCore.emit does not. Is there some anything I can do (even if it is similarly
hideous) to hijack the call to emit?

We're currently using PyQt 4.1, sip 4.5.

Thanks a lot in advance,
-carlos


More information about the PyQt mailing list