Индикатор выполнения копирования файла PyQt - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь получить QProgressBar для отображения хода копирования файла в PyQt.Я искал и дошел до запуска фактической копии в потоке, используя QFile.Я просто не могу заставить бар обновляться, хотя.

Вот код:

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, поэтому любая помощь будет отличной.

Ответы [ 2 ]

1 голос
/ 29 марта 2011

Хорошо, вот то, что я придумал, которое работает, но, очевидно, замедляет производительность копирования файлов.

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 голосов
/ 29 марта 2011

QFile не испускает байтов. Написано:

В отличие от других QIODevice реализации, такие как QTcpSocket, QFile не испускает aboutToClose (), bytesWritten () или готовые сигналы (). это детали реализации означает, что QFile не подходит для чтения и написание определенных типов файлов, таких как в виде файлов устройств на платформах Unix.

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

Вы должны будете реализовать свой собственный цикл и самостоятельно генерировать прогресс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...