PyQt5: pop-up progressbar using QThread

前端 未结 2 1551
臣服心动
臣服心动 2021-01-25 02:24

How can I implement a progress bar in a pop-up window that monitors the progress of a running function from a so-called Worker class (i.e. time

2条回答
  •  梦毁少年i
    2021-01-25 03:04

    Based on eyllanesc's answer, this is how a working code could look:

    import sys
    import time
    from PyQt5.QtCore import QThread, pyqtSignal, QObject, pyqtSlot
    from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QHBoxLayout, QProgressBar, QVBoxLayout
    
    
    class MainWindow(QWidget):
        def __init__(self):
            super().__init__()
            self.setWindowTitle("Widget")
            self.h_box = QHBoxLayout(self)
            self.main_window_button = QPushButton("Start")
            self.popup = PopUpProgressB()  # Creating an instance instead as an attribute instead of creating one 
            # everytime the button is pressed 
            self.main_window_button.clicked.connect(self.popup.start_progress)  # To (re)start the progress
            self.h_box.addWidget(self.main_window_button)
            self.setLayout(self.h_box)
            self.show()
    
    
    class Worker(QObject):
        finished = pyqtSignal()
        intReady = pyqtSignal(int)
    
        @pyqtSlot()
        def proc_counter(self):  # A slot takes no params
            for i in range(1, 100):
                time.sleep(0.1)
                self.intReady.emit(i)
    
            self.finished.emit()
    
    
    class PopUpProgressB(QWidget):
    
        def __init__(self):
            super().__init__()
            self.pbar = QProgressBar(self)
            self.pbar.setGeometry(30, 40, 500, 75)
            self.layout = QVBoxLayout()
            self.layout.addWidget(self.pbar)
            self.setLayout(self.layout)
            self.setGeometry(300, 300, 550, 100)
            self.setWindowTitle('Progress Bar')
            # self.show()
    
            self.obj = Worker()
            self.thread = QThread()
            self.obj.intReady.connect(self.on_count_changed)
            self.obj.moveToThread(self.thread)
            self.obj.finished.connect(self.thread.quit)
            self.obj.finished.connect(self.hide)  # To hide the progress bar after the progress is completed
            self.thread.started.connect(self.obj.proc_counter)
            # self.thread.start()  # This was moved to start_progress
    
        def start_progress(self):  # To restart the progress every time
            self.show()
            self.thread.start()
    
        def on_count_changed(self, value):
            self.pbar.setValue(value)
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        main_window = MainWindow()
        sys.exit(app.exec_())
    

提交回复
热议问题