2011-03-28 68 views
0

我想获得一个QProgressBar来显示在PyQt文件副本的进度。我已经看过,我已经尽可能在使用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中......哪一个没有显示。 – 2011-03-28 23:17:19

回答

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:

不同于其他的QIODevice 实现方式中,如与QTcpSocket, QFile时不发出 aboutToClose(),bytesWritten(),或 readyRead()信号。这个 的实现细节意味着QFile 不适合读取,并且 写入某些类型的文件,如 作为Unix平台上的设备文件。

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

您必须实现自己的循环,并发出自己的进步。