<p>这是我自己建议的更详细的版本,不一定是unittest的最佳解决方案,但我认为其他遇到这种情况的人会感兴趣:</p>
<p>Carlos Scheidegger在pyqt邮件列表(<a href="http://thread.gmane.org/gmane.comp.python.pyqt-pykde/9242/focus=9245" rel="nofollow noreferrer">http://thread.gmane.org/gmane.comp.python.pyqt-pykde/9242/focus=9245</a>)上发布</p>
<pre><code>_oldConnect = QtCore.QObject.connect
_oldDisconnect = QtCore.QObject.disconnect
_oldEmit = QtCore.QObject.emit
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)
def new_emit(self, *args):
emitCall(self, *args)
_oldEmit(self, *args)
QtCore.QObject.emit = new_emit
</code></pre>
<p>只需调用enableSignalDebugging(emitCall=foo)并监视信号,直到
你肚子不舒服:)</p>