PyQtテスト(QThreadスレッドとカスタム信号):QProgressDialogでコピー進捗を表示する


粗いテストコード......
from PyQt5.Qt import *
import sys, shutil, os, time


class CopyFile(QThread):
    #          ,              :             ,     
    pathError = pyqtSignal()
    def setFile(self,src, dst):
        #                  ,         
        self.src = src
        self.dst = dst
    def run(self):
        if os.path.exists(self.src):
            shutil.copy2(self.src, self.dst)
        else:
            self.pathError.emit()

class CopyProgress(QThread):
    #                ,               。
    checked = pyqtSignal(int)
    def setFile(self, src, dst):
        #                  ,         
        self.src = src
        self.dst = dst
        self.value = 0

    def run(self):
        while 1:
            time.sleep(1)
            if os.path.getsize(self.src)>os.path.getsize(self.dst):
                self.value = int(os.path.getsize(self.dst)/os.path.getsize(self.src)*100)
            else:
                self.value = 100
            if self.value == 100:
                self.checked.emit(100)
                break

            self.checked.emit(self.value)

class Mwindow(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(300,200)
        self.src = "../movie4.mkv"
        self.dst = "E:\\movie4.mkv"
        self.initui()
    def initui(self):
        self.pg = QProgressDialog(self)
        self.pg.setMinimumDuration(1)

        button = QPushButton(self)
        button.setText("  -    ")
        button.clicked.connect(lambda:self.copy_file())


    def copy_file(self):
        self.copy_thread = CopyFile()
        self.copy_thread.setFile(self.src,self.dst)
        self.copy_thread.pathError.connect(lambda:print("    "))
        self.copy_thread.start()
        self.show_copy()

    def show_copy(self):
        self.show_progress = CopyProgress()
        self.show_progress.start()
        self.show_progress.setFile(self.src, self.dst)
        self.show_progress.checked.connect(lambda v:self.pg.setValue(v))




app = QApplication(sys.argv)

w = Mwindow()
w.show()

sys.exit(app.exec_())