3

我有一个带有状态栏的 qt 程序。我正在寻找一种更新此状态栏的好方法。我当然可以从代码中发出信号,但我希望将 gui 和“真实”代码分开,并且我希望代码能够独立于 gui 运行。我想出的解决方案是将小计提供给 gui,如下面的一个极其简化的示例所示。

#in file1:
from time import sleep

class WorkerClass():
    def updater(self):
        yield 10  # total
        if some_condition:
            yield 'end'  # return early
        for i in xrange(1, 11):
            sleep(1)  # dummy for real task
            yield i  # subtotal


#in file2, in some function in the MainWindow class:
worker = WorkerClass()
u = worker.updater()
total = u.next()
self.progress_bar.setRange(0, total)
for i in u:
    if i == 'end': break
    self.progress_bar.setValue(i)
print 'done!'

然而,我觉得这不是应该做的方式。什么是返回小计的更好方法,而不在 file1 中使用 qt 代码?

4

1 回答 1

2

将进度条设置为(自定义)观察者。例如:

def dowork(observer=None):
  worker = WorkerClass()
  u = worker.updater()
  total = u.next()
  if observer:
    observer.progress_total(total)
  for i in u:
    if i == 'end': break
    if observer:
      observer.progress(i)
  print 'done!'

观察者可能看起来像:

class ProgressBarObserver(object):
  def __init__(self, progbar):
    self.progbar = progbar
  def progress_total(self, n):
    self.progbar.setRange(0, n)
  def progress(self, i):
    self.progbar.setValue(i)

调用代码将它们配对:

dowork(ProgressBarObserver(self.progress_bar))

我希望这会有所帮助。

于 2013-04-06T15:24:08.383 回答