为初学者简单解释PyQt进度条的方法

A simplistic way to explain PyQt progress bar for beginners

我正在尝试制作一个进度条来处理我在 pyqt 中非常简单的测试应用程序,但不幸的是,我不知道如何实现一些 examples 我在他们检查我时看到的头所以请忍受我的新手问题。

假设我有一个非常简单的 QMainWindow

class Window(QtGui.QMainWindow):

    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(750, 450, 400, 200)
        self.setFixedSize(self.size())
        btn1 = QtGui.QPushButton("Convert", self)
        btn1.move(210,171)
        btn1.clicked.connect(self.output_convert)

    def output_convert(self):
        #very long process to convert a txt file to excel
        #Here is where I would like to implement a progress bar

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    app.exec_()

run()

如何在 output_convert 中至少实现一个脉冲进度条? 真正让我困惑的是我如何 call/execute example 中的代码。我可以在没有子类化的情况下纯粹在函数中做到吗?它取决于 output_convert 代码吗? TLDR:如何在执行很长的代码时实现进度条(新手友好)?

更新 1 一整天后我让它部分工作这是我的代码

class Window(QtGui.QMainWindow):
    def __init__(self):
        super(Window, self).__init__()
        self.setGeometry(750, 450, 400, 200)
        self.setFixedSize(self.size())
        btn1 = QtGui.QPushButton("Convert", self)
        btn1.move(210,171)
        btn1.clicked.connect(self.progbar)

    def progbar (self):
        self.prog_win = QDialog()
        self.prog_win.resize(400, 100)
        self.prog_win.setFixedSize(self.prog_win.size())
        self.prog_win.setWindowTitle("Processing request")
        self.lbl = QLabel(self.prog_win)
        self.lbl.setText("Please Wait.  .  .")
        self.lbl.move(15,18)
        self.progressBar = QtGui.QProgressBar(self.prog_win)
        self.progressBar.resize(410, 25)
        self.progressBar.move(15, 40)
        self.progressBar.setRange(0,1)
        self.myLongTask = TaskThread()

        #I think this is where I am wrong
        self.prog_win.show()
        self.myLongTask.taskFinished.connect(self.onStart)
        self.output_settings()

    def onStart(self): 
        self.progressBar.setRange(0,0)
        self.myLongTask.start()

    def output_convert(self):
        #very long process to convert a txt file to excel

class TaskThread(QtCore.QThread):
    taskFinished = QtCore.pyqtSignal()
    def run(self):
        time.sleep(3)
        self.taskFinished.emit()

def run():
    app = QtGui.QApplication(sys.argv)
    GUI = Window()
    app.exec_()
run()

我现在可以看到我缺少什么,我真正需要的是什么。我四处阅读,每个人都说它需要多线程,子类化是个坏主意。它部分工作,因为进度条在处理时挂起。

        self.progressBar = QtWidgets.QProgressBar(self.centralWidget)
        self.progressBar.setGeometry(QtCore.QRect(150, 140, 481, 37))
        self.progressBar.setStyleSheet("your values")
        self.progressBar.setProperty("value", 70)
        self.progressBar.setObjectName("progressBar")

这是我用过的进度条的代码, 第一行定义了 QtWidget 的类型,在我们的例子中是进度条,它接受参数,central widget,这表明这将是中央 widget 的一部分, set geometry 是 positioning 和 size。 设置样式表是您指定颜色和内容的地方。 set属性函数是用来设置进度条的值或者填充的,这个就是你要改变的。

Most 时间此小部件 os 依赖。也就是说,如果您使用 windows,默认情况下您将获得 windows 脉冲进度条。但在其他操作系统中,例如 linux,您必须使用 setstyle() 函数设置小部件的默认样式。