Debugging a pyQT4 app? Debugging a pyQT4 app? python python

Debugging a pyQT4 app?


You need to call QtCore.pyqtRemoveInputHook. I wrap it in my own version of set_trace:

def debug_trace():  '''Set a tracepoint in the Python debugger that works with Qt'''  from PyQt4.QtCore import pyqtRemoveInputHook  # Or for Qt5  #from PyQt5.QtCore import pyqtRemoveInputHook  from pdb import set_trace  pyqtRemoveInputHook()  set_trace()

And when you are done debugging, you can call QtCore.pyqtRestoreInputHook(), probably best when you are still in pdb, and then after you hit enter, and the console spam is happening, keep hitting 'c' (for continue) until the app resumes properly. (I had to hit 'c' several times for some reason, it kept going back into pdb, but after hitting it a few times it resumed normally)

For further info Google "pyqtRemoveInputHook pdb". (Really obvious isn't it? ;P)


I had to use a "next" command at the trace point to get outside of that function first. For that I made a modification of the code from mgrandi:

def pyqt_set_trace():    '''Set a tracepoint in the Python debugger that works with Qt'''    from PyQt4.QtCore import pyqtRemoveInputHook    import pdb    import sys    pyqtRemoveInputHook()    # set up the debugger    debugger = pdb.Pdb()    debugger.reset()    # custom next to get outside of function scope    debugger.do_next(None) # run the next command    users_frame = sys._getframe().f_back # frame where the user invoked `pyqt_set_trace()`    debugger.interaction(users_frame, None)

This worked for me. I found the solution from here : Python (pdb) - Queueing up commands to execute


In my tests, jamk's solution works, while the previous one, although simpler, does not.

In some situations, for reasons that are unclear to me, I've been able to debug Qt without doing any of this.