2016-11-12 1 views
1

私はファイルを収集して後でコピーするというタスクがあるとしましょう。 QProgressBarを収集すると、不明確な「ビジー」状態が表示されます。その後、そのプロセスは、収集されたファイルをコピーして進行状況を表示するために移動しています。 問題は、私がそのうちのどれをでも行うことができますが、連続プロセスで一緒にはできないことです。 DownはPySideの小さなコードで、QButton 1と2を押すことでこの動作を示しますが、連続タスクでは表示されません。助けてください。QProgressBarで「ビジー」モードから標準プログレスモードに移行するには?

import sys, time 
from PySide.QtGui import * 
from PySide.QtCore import * 

class WidgetWithBar(QWidget): 
    def __init__(self): 
     super(WidgetWithBar, self).__init__() 

     self.progress = QProgressBar(self) 
     self.progress . setAlignment(Qt.AlignJustify) 
     self.progress . setValue(0) 

     button1   = QPushButton("Waiting for Job", self) 
     button1   . clicked.connect(self.wait) 
     button2   = QPushButton("Doing Job", self) 
     button2   . clicked.connect(self.go) 

     self.layout = QVBoxLayout() 
     self.layout.addWidget(self.progress) 
     self.layout.addWidget(button1) 
     self.layout.addWidget(button2) 
     self.setLayout(self.layout) 

    def wait(self): 
     self.progress.setRange(0,0) 
     # -- this two lines to comment out 
     #time.sleep(2) 
     #self.go() 
     # -- EOLines to comment out 

    def go(self): 
     n = 20 
     self.progress.setRange(0,n) 
     # DO SOMETHING TO SHOW THE PROGRESS 
     for t in range(n): 
      time.sleep(.1) 
      self.progress.setValue(t+1) 

def main(): 
    app = QApplication(sys.argv) 
    w = WidgetWithBar() 
    w.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 

私は最初のボタンを押すと、両方の機能を起動するには、上部の2行をコメントアウトするかどうので、プログレスバーがすべてでは「ビジー」モードを示していないでしょう!

答えて

2

別々のスレッドで時間のかかる作業を行い、進捗状況を更新するシグナルを放出する必要があります。以下は、あなたの例に基づいた簡単なデモです:

import sys, time, random 
from PySide.QtGui import * 
from PySide.QtCore import * 

class Worker(QThread): 
    progressChanged = Signal(int, int) 

    def run(self): 
     items = [] 
     count = random.randint(5, 10) 
     print('collecting items...') 
     while len(items) < count: 
      items.append(1) 
      time.sleep(.5) 
     print('processing items...') 
     for index, item in enumerate(items): 
      self.progressChanged.emit(index, count) 
      time.sleep(0.5) 

class WidgetWithBar(QWidget): 
    def __init__(self): 
     super(WidgetWithBar, self).__init__() 

     self.progress = QProgressBar(self) 
     self.progress . setAlignment(Qt.AlignJustify) 
     self.progress . setValue(0) 

     button1   = QPushButton("Start Job", self) 
     button1   . clicked.connect(self.handleStart) 

     self.layout = QVBoxLayout() 
     self.layout.addWidget(self.progress) 
     self.layout.addWidget(button1) 
     self.setLayout(self.layout) 

     self._worker = Worker(self) 
     self._worker.progressChanged.connect(self.handleProgress) 

    def handleProgress(self, step, count): 
     if not self.progress.maximum(): 
      self.progress.setRange(0, count - 1) 
     self.progress.setValue(step) 

    def handleStart(self): 
     if not self._worker.isRunning(): 
      self.progress.setRange(0,0) 
      self._worker.start() 

def main(): 
    app = QApplication(sys.argv) 
    w = WidgetWithBar() 
    w.show() 
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
関連する問題