<p>我试图混合使用信号槽连接(<code>editingFinished</code>)和eventFilter。但是,我遇到了一些奇怪的bug,这些bug可能是由一些竞争条件引起的,或者仅仅是因为代码背后的逻辑变得过于扭曲。不管怎样,下面的片段很好用,也许对某些人有帮助:</p>
<pre><code>def eventFilter(self, source, event):
"""
Filter all events generated by the QLineEdit widgets. Source and type
of all events generated by monitored objects are passed to this eventFilter,
evaluated and passed on to the next hierarchy level.
- When a QLineEdit widget gains input focus (QEvent.FocusIn`), display
the stored value with full precision
- When a key is pressed inside the text field, set the `spec_edited` flag
to True.
- When a QLineEdit widget loses input focus (QEvent.FocusOut`), store
current value in linear format with full precision (only if
`spec_edited`== True) and display the stored value in selected format
"""
if isinstance(source, QtGui.QLineEdit): # could be extended for other widgets
if event.type() == QEvent.FocusIn:
self.spec_edited = False
self.get_entries()
elif event.type() == QEvent.KeyPress:
self.spec_edited = True
elif event.type() == QEvent.FocusOut:
self._store_entries(source)
# Call base class method to continue normal event processing:
return super(InputAmpSpecs, self).eventFilter(source, event)
</code></pre>