<p>是的,您可以很容易地使用<a href="http://qt-project.org/doc/qt-4.8/qcoreapplication.html#processEvents" rel="nofollow noreferrer">processEvents</a>来实现这一点,这正是为此目的而提供的。在</p>
<p>我用这个技术实现了一个简单的“在文件中查找”对话框。您需要做的就是启动一个函数,该函数用<a href="http://qt-project.org/doc/qt-4.8/qtimer.html#singleShot" rel="nofollow noreferrer">single-shot timer</a>处理文件,然后在循环中周期性地调用<code>processEvents</code>。这应该足够好,以更新计数器处理的文件数,也允许用户取消进程,如果必要的话。在</p>
<p>唯一真正的问题是决定调用<code>processEvents</code>的频率。您调用它的频率越高,GUI的响应就越快—但这是以大大减慢文件处理速度为代价的。所以你可能需要做一点实验,以便找到一个可以接受的折衷方案。在</p>
<p><strong>更新</strong>:</p>
<p>下面是一个简单的演示,演示如何构造代码:</p>
<pre><code>import sys, time
from PyQt5 import QtWidgets, QtCore
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.button = QtWidgets.QPushButton('Start')
self.progress = QtWidgets.QLabel('0')
layout = QtWidgets.QVBoxLayout(self)
layout.addWidget(self.button)
layout.addWidget(self.progress)
self.button.clicked.connect(self.test)
self._stop = False
self._stopped = True
def test(self):
if self._stopped:
self._stop = False
self.progress.setText('0')
self.button.setText('Stop')
QtCore.QTimer.singleShot(1, self.process)
else:
self._stop = True
def process(self):
self._stopped = False
for index in range(1, 1000):
time.sleep(0.01)
self.progress.setText(str(index))
if not index % 20:
QtWidgets.qApp.processEvents(
QtCore.QEventLoop.AllEvents, 50)
if self._stop:
break
self._stopped = True
self.button.setText('Start')
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
</code></pre>