如何通过调用另一个函数的QThread更新PyQT中的Progressbar

How to update Progressbar in PyQT through QThread which calls another function

我对 PyQT 很陌生。我正在学习如何制作 Progressbar 并随着算法的进展对其进行更新。我已经能够制作一个使用此 link 进行自我更新的基本进度条:

问题是,我需要对我的算法做同样的事情,而那个算法有不同的功能,不能写在 QThread 的 run 函数中。

这是我的 QThread 代码 class,(与上面给出的相同 link)

class External(QThread):

    countChanged = pyqtSignal(int)
    
    def run(self):
        count = 0 
        while count < 100:
            count += 1
            time.sleep(1)
            self.countChanged.emit(count)

这是我的进度条的代码,

def generate_timetable(self):
        self.calc = External() 
        self.calc.countChanged.connect(self.onCountChanged)
        self.calc.start()
    
    def onCountChanged(self, value):
        self.ui.progressBar.setValue(value)

现在,这是我的算法函数的伪代码(这个函数将基本上取代 time.sleep(1) 函数

def algorithm():

    fh = False
    best_solution = None
    count = 1 
    best_fitness = 100000 # any huge number  
    while fh is False:
        fh = True
        solution, solution_fitness = another_function() 
        if solution_fitness < best_fitness:
            best_solution = solution 
            best_fitness = solution_fitness 
            fh = False
        
        print("ITERATION #", count, " is OVER!")
        print("Best Solution FItness: ", best_fitness)
        count += 1 
    
    return best_solution, best_fitness

我需要做的是在每次迭代后,我的线程 class 发出一个信号,并且最佳解决方案的适应度值打印在我的主 GUI 上(我有一个标签)并且 Progressbar 的值也是已更新(假设我希望它仅更新 1 个计数,就像在当前程序中所做的那样)

然而,问题是我不能 return 一次迭代后的适应度值,因为如果我这样做,我的算法将需要重新启动,因此我将失去我的进步。但是如果没有 return 函数的值,我不知道我怎么可能知道一次迭代已经结束所以现在发出信号,更新进度条值并将标签值设置为计算出的适应度值迭代后。

任何人都可以指导我吗?或向我展示任何与此类似的项目。

我认为您只需将信号从 pyqtSignal(int) 更改为 pyqtSignal(int, int),然后在您的算法循环中 self.countChanged.emit(count, best_fitness) 即可获得您想要的结果。如果您希望它们分开,您还可以为健身定义第二个信号。