<p>回头看看这个<a href="https://stackoverflow.com/questions/569650/how-to-keep-track-of-thread-progress-in-python-without-freezing-the-pyqt-gui">question I asked</a>。有一个代码示例可以帮助您找出需要执行的操作。</p>
<p>你所说的注册你的信号让我想到了这个代码(从上面的问题):</p>
<pre><code>class ProcessingThread(threading.Thread, QtCore.QObject):
__pyqtSignals__ = ( "progressUpdated(str)",
"resultsReady(str)")
</code></pre>
<p>我在示例中传递字符串,但您应该能够用<code>list</code>替换<code>str</code>。</p>
<p>如果结果发现不能传递可变对象,可以像我在示例中那样处理结果(即在线程中设置一个<code>results</code>变量,告诉主线程它们已经准备好了,并让主线程“接收它们”)。</p>
<p><strong>更新:</strong></p>
<p>您得到消息<code>QObject::connect: Cannot queue arguments of type 'statuses'</code>,因为您需要定义当您发出信号时将通过的<em>类型</em>参数。要传递的类型是<code>list</code>,而不是<code>statuses</code>。</p>
<p>当你连接你的信号时,它应该是这样的:</p>
<pre><code>QtCore.QObject.connect(self.twit_in,
QtCore.SIGNAL("newStatuses(list)"),
self.update_tweet_list)
</code></pre>
<p>当你发出信号时,它应该是这样的:</p>
<pre><code>self.emit(SIGNAL("newStatuses(list)"), statuses)
</code></pre>
<p>假设<code>statuses</code>是一个列表。请注意,根据您的情况,您可能需要发送列表的深层副本。</p>
<p><strong>更新2:</strong></p>
<p>好的,使用<code>list</code>作为类型是不正确的。从PyQt4帮助参考:</p>
<blockquote>
<h2>PyQt Signals and Qt Signals</h2>
<p>Qt signals are statically defined as
part of a C++ class. They are
referenced using the
<code>QtCore.SIGNAL()</code> function. This
method takes a single string argument
that is the name of the signal and its
C++ signature. For example::</p>
<pre><code>QtCore.SIGNAL("finished(int)")
</code></pre>
<p>The returned value is normally passed
to the <code>QtCore.QObject.connect()</code>
method.</p>
<p>PyQt allows new signals to be defined
dynamically. The act of emitting a
PyQt signal implicitly defines it.
PyQt v4 signals are also referenced
using the <code>QtCore.SIGNAL()</code>
function.</p>
<h2>The <code>PyQt_PyObject</code> Signal Argument Type</h2>
<p>It is possible to pass any Python
object as a signal argument by
specifying <code>PyQt_PyObject</code> as the
type of the argument in the signature.
For example::</p>
<pre><code>QtCore.SIGNAL("finished(PyQt_PyObject)")
</code></pre>
<p>While this would normally be used for
passing objects like lists and
dictionaries as signal arguments, it
can be used for any Python type. Its
advantage when passing, for example,
an integer is that the normal
conversions from a Python object to a
C++ integer and back again are not
required.</p>
<p>The reference count of the object
being passed is maintained
automatically. There is no need for
the emitter of a signal to keep a
reference to the object after the call
to <code>QtCore.QObject.emit()</code>, even if
a connection is queued.</p>
</blockquote>