正在调试pyQT4应用程序?

问题描述 投票:43回答:3

我有一个使用pyqt4构建的相当简单的应用。我想调试连接到应用程序中按钮之一的功能。但是,当我执行以下操作时

python -m pdb app.pyw
> break app.pyw:55  # This is where the signal handling function starts.

事情并非如我所愿。调试器没有进入设置断点的功能并让我逐步执行它,而是进入了打印QCoreApplication::exec: The event loop is already running的无限循环,而我无法输入任何内容。有更好的方法吗?

python qt pyqt4
3个回答
83
投票

您需要呼叫QtCore.pyqtRemoveInputHook。我将其包装在自己的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()

并且当您完成调试后,可以调用QtCore.pyqtRestoreInputHook(),这可能最好,当您仍然在pdb中时,然后按Enter键,并且控制台垃圾邮件正在发生时,请继续按'c'(以继续),直到应用正确恢复。 (由于某种原因,我不得不多次击打'c',它一直返回到pdb中,但是击中几次之后,它又恢复了正常运行)

有关详细信息,请使用Google“ pyqtRemoveInputHook pdb”。 (真的很明显吗?; P)


3
投票

我必须在跟踪点使用“ next”命令才能首先退出该函数。为此,我对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)

这对我有用。我从这里找到了解决方案:Python (pdb) - Queueing up commands to execute


0
投票

在我的测试中,jamk的解决方案有效,而前一个解决方案虽然简单,却没有。

在某些情况下,由于我不清楚的原因,我能够在不执行任何上述操作的情况下调试Qt。

© www.soinside.com 2019 - 2024. All rights reserved.