Lutfen calisan kod atmaya ozen gosterin.
Dedigim gibi, ana thread’de yapilan islemleri yeni thread’e almak lazim:
### import'lar ###
class MainWindow(QMainWindow):
createProgressSignal = pyqtSignal()
finishProgressSignal = pyqtSignal()
def __init__(self):
super().__init__()
self.setWindowTitle("My App")
self.setFixedSize(300,100)
layout = QVBoxLayout()
button= QPushButton("do some works")
layout.addWidget(button)
button.clicked.connect(self.doSomethingWorks)
self.createProgressSignal.connect(self.createProgress)
self.finishProgressSignal.connect(self.finishProgress)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
def doSomethingWorks(self):
# işlem öncesinde qprogressdialog çağırma simyali yay
self.createProgressSignal.emit()
threading.Thread(target=self.threadMain, args=(self.finishProgressSignal,)).start()
def threadMain(self, finishSignal):
# Yapılacak bir işlemi simüle eden döngü.
# Main thread bu şekilde bir işlem yaparken QProgressDialog çağırılır
for i in range(20):
print(i)
time.sleep(0.5)
print("işlem bitti")
# işlem sonrasında qprogressdialog sonlandırma sinayali yay
finishSignal.emit()
def createProgress(self):# progress dialog oluşturme ve çalıştırma slotu
self.progress = ProgressDialog("İşlem Ekrani","İşlem Yapılıyor...",0,0,self) # Progress dialog tanımlama
# event loop gerekiyor. Bu haliyle boş pencere döndürüyor.
def finishProgress(self): # progress dialog kapatma slotu
self.progress.close()
class ProgressDialog(QProgressDialog):
def __init__(self,win_label,text,min,max=0,parent=None):
super(ProgressDialog,self).__init__(parent)
self.setWindowTitle(win_label)
self.setLabelText(text)
self.setFixedSize(400,100)
self.setRange(min,max)
self.setCancelButton(None)
self.setWindowModality(Qt.WindowModal)
self.show()
app = QApplication(sys.argv)
window = MainWindow()
window.show()
app.exec()