2011-03-28 3 views
0

PyQt에서 파일 복사본의 진행 상태를 표시하는 QProgressBar를 얻으려고합니다. 나는 대략 보았고 QFile을 사용하는 쓰레드에서 실제 복사본을 실행하는 것으로 끝났다. 나는 단지 바를 업데이트 할 수 없다. 신호가 분명 방출되는되지 않도록PyQt 파일 복사 진행률 표시 줄

class ProgressDialog(QtGui.QDialog): 

    def __init__(self, parent, source, destination): 
     QtGui.QDialog.__init__(self, parent) 
     self.parent = parent 
     self.source = source 
     self.destination = destination 

     self.add_diag = progress_diag.Ui_Dialog() 
     self.add_diag.setupUi(self) 

     self.add_diag.infoLabel.setText("Copying: %s" % (self.source)) 
     self.sourcefile = QtCore.QFile(self.source) 

     self.add_diag.progressBar.setMinimum(0) 
     self.add_diag.progressBar.setMaximum(self.sourcefile.size()/1024) 

     self.written = 0 

     self.show() 
     self.copy() 

    def copy(self): 

     copy_thread = CopyThread(self, self.sourcefile, self.destination) 
     self.connect(copy_thread.destination_file, QtCore.SIGNAL("bytesWritten(qint64)"), self.update_progress) 
     copy_thread.procDone.connect(self.finished_copy) 
     copy_thread.start() 

    def update_progress(self, progress): 
     print "Working", progress 
     self.written += progress 
     self.add_diag.progressBar.setValue(written/1024) 

    def finished_copy(self, state): 
     self.close() 

class CopyThread(QtCore.QThread): 

    procDone = QtCore.pyqtSignal(bool) 

    def __init__(self, parent, source, destination): 
     QtCore.QThread.__init__(self, parent) 
     self.source = source 
     self.destination_file = QtCore.QFile(destination) 

    def run(self): 
     self.source.copy(self.destination_file.fileName()) 
     self.procDone.emit(True) 

update_progess라는 결코 극복하지만 난 이유를 잘 모르겠어요 :

는 여기에 몇 가지 코드입니다.

필자는이 점을 높이 및 낮게 조사했지만 좋은 PyQt 해결책을 찾지 못해 어떤 도움도 도움이 될 것입니다.

+0

문제는 CopyThread ...에 표시되는 것 같습니다. 표시되지 않습니다. –

답변

0

내가 좋아하는 점은 어떤 것이 작동했는지는 분명하지만 파일 복사 성능이 느려집니다.

class ProgressDialog(QtGui.QDialog): 

    def __init__(self, parent, source, destination): 
     QtGui.QDialog.__init__(self, parent) 
     self.parent = parent 
     self.source = source 
     self.destination = destination 
     self.add_diag = progress_diag.Ui_Dialog() 
     self.add_diag.setupUi(self) 

     self.add_diag.infoLabel.setText("Copying: %s" % (self.source)) 

     self.add_diag.progressBar.setMinimum(0) 
     self.add_diag.progressBar.setMaximum(100) 
     self.add_diag.progressBar.setValue(0) 

     self.show() 
     self.copy() 

    def copy(self): 

     copy_thread = CopyThread(self, self.source, self.destination) 
     copy_thread.procPartDone.connect(self.update_progress) 
     copy_thread.procDone.connect(self.finished_copy) 
     copy_thread.start() 

    def update_progress(self, progress): 
     self.add_diag.progressBar.setValue(progress) 

    def finished_copy(self, state): 
     self.close() 

class CopyThread(QtCore.QThread): 

    procDone = QtCore.pyqtSignal(bool) 
    procPartDone = QtCore.pyqtSignal(int) 

    def __init__(self, parent, source, destination): 
     QtCore.QThread.__init__(self, parent) 
     self.source = source 
     self.destination = destination 

    def run(self): 
     self.copy() 
     self.procDone.emit(True) 

    def copy(self): 
     source_size = os.stat(self.source).st_size 
     copied = 0 
     source = open(self.source, "rb") 
     target = open(self.destination, "wb") 

     while True: 
      chunk = source.read(1024) 
      if not chunk: 
       break 
      target.write(chunk) 
      copied += len(chunk) 
      self.procPartDone.emit(copied * 100/source_size) 

     source.close() 
     target.close() 
0

Qfile을는 bytesWritten 발광하지 않는다 :

는 QTcpSocket 다른 QIODevice 구현 달리 Qfile을가 aboutToClose() bytesWritten() 또는 readyRead() 신호를 방출하지 않는다. 이 구현 세부 정보는 QFile 이 읽기에는 적합하지 않으며 등의 특정 유형의 파일을 Unix 플랫폼에 장치 파일로 작성한다는 것을 의미합니다.

http://doc.qt.nokia.com/latest/qfile.html

당신은 자신을 자신의 루프를 구현하고 진행 상황을 방출해야합니다

.