擅长:python、mysql、java
<p>直到控件返回到Qt事件循环(一旦slot<code>OK</code>完成),GUI的更新才会发生。你知道吗</p>
<p>这是一个常见的问题,当您有一个长期运行的插槽,并希望图形用户界面的变化是可见的插槽结束之前。这个问题有一些答案,其中详细说明了一些解决方法:
<a href="https://stackoverflow.com/questions/2482437/label-in-pyqt4-gui-not-updating-with-every-loop-of-for-loop">Label in PyQt4 GUI not updating with every loop of FOR loop</a></p>
<p>基本上,将长时间运行的工作卸载到QThread通常是最好的主意,但是只有在长时间运行的代码不直接与GUI交互的情况下,您才能轻松地做到这一点(您无法从线程与GUI交互,因此这会变得很棘手)。线程很容易出错,并且会严重破坏程序的稳定性,因此您可能不想走这条路。你知道吗</p>
<p>另一个选项是在<code>__init__</code>方法中调用<code>QApplication.instance().processEvents()</code>(或将<code>app</code>分配给<code>self.app</code>),然后在更新GUI的调用之后立即调用<code>self.app.processEvents()</code>(如<code>setHidden()</code>),但我通常会尽量避免这种情况,因为我认为这是一种不好的做法。你知道吗</p>
<p>最后的解决方案,也是在您的情况下最有效的解决方案,是调用<code>QTimer.singleShot(1,self.calcA)</code>,而不是<code>self.calcA</code>。这将把控制权返回到事件循环,事件循环将更新GUI,然后调用<code>self.calcA</code>。你知道吗</p>