擅长:python、mysql、java
<p>问题是你有这样的伪代码:</p>
<pre><code>def OK(self):
modify GUI
self.long_running_function()
</code></pre>
<p>微妙的是,对GUI所做的修改只有在Qt事件循环恢复之后,即在OK()返回之后才会得到“处理”。这就是为什么看起来好像长时间运行的函数是在上面的行之前执行的。不是这样,但是上面的行只有在OK()返回时才得到“activate”,这是在长时间运行的函数完成之后。你知道吗</p>
<p>因此,如果您想让GUI更新在可见之前完成,就不能在OK中长时间运行函数。解决方案取决于长时间运行的函数:如果它是一个循环,您可以这样编写:</p>
<pre><code>def long_running_function(self):
while condition:
self.doQuickStuff()
</code></pre>
<p>然后可以替换为:</p>
<pre><code>def doQuickStuff(self):
if condition:
.... do stuff ....
# repeat:
# 10 ms should give time for some event processing
QTimer.singleShot(10, self.doQuickStuff)
def OK(self):
modify GUI
doQuickStuff()
</code></pre>
<p>否则,只需将长时间运行的函数移到QThread。您必须考虑以下问题:</p>
<ol>
<li>需要向用户更新正在进行的计算/操作,稍后将提供结果</li>
<li>可能需要定期更新用户的实际进度</li>
<li>您需要一种方法来中断计算,以防用户在线程仍在运行时退出应用程序</li>
</ol>