由于我有一个耗时的子程序,所以我想用QTimer()加上进度条的方法优化用户的等待时间,
但是,当我初始化计时器,并start()后,发现相关的超时槽函数并没有触发,这是为什么了?
"""创建一个带提示的进度条"""
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys
import time
class MyProgressBar(QWidget):
def __init__(self,showMessage = "提示信息",parent = None):
super(MyProgressBar, self).__init__(parent)
self.message = showMessage
self.setWindowTitle("加载数据")
self.pbar = QProgressBar() # 构建一个进度条
self.label = QLabel()
# 添加到布局
self.layout = QVBoxLayout()
self.setLayout(self.layout)
self.layout.addWidget(self.label) # 提示信息
self.layout.addWidget(self.pbar) # 进度条
self.label.setText(self.message)
self.timer = QTimer(self) # 初始化一个时钟
self.step = 0 # 进度条的值
self.timer.start(50)
self.timer.timeout.connect(self.update)
self.show()
#self.setWindowFlags(Qt.WindowStaysOnTopHint)
def setMessage(self,message):
"""重新设置信息,并重启进度条"""
print(self.timer.isActive())
self.message = message
self.step = 0
if not self.timer.isActive():
self.timer.start(50)
self.show()
def callback(self, signal):
print("调用回调函数",signal)
if signal is False:
return
if self.timer.isActive(): # 当前正在运行
self.pbar.setValue(100)
self.timer.stop()
self.step = 0 # 重置
QMessageBox.information(
self,
"提示",
"{},已经完成".format(self.message),
QMessageBox.Yes | QMessageBox.No
)
#self.setWindowModality(Qt.NonModal)
self.hide()
def update(self):
print("调用的时钟事件")
self.pbar.setValue(self.step) # 赋新值
if self.step >= 100:
# 停止进度条
self.timer.stop()
self.step = 0
# 卡在99%,等后台程序运行完成则到100%
elif self.step < 99:
self.step += 1
def worker():
time.sleep(5)
if __name__ == '__main__':
app = QApplication(sys.argv)
myui = MyProgressBar(showMessage="第一次")
worker() # 模拟耗时程序
myui.callback(True)
# time.sleep(1)
# myui.setMessage("第二次")
# time.sleep(5)
# myui.callback(True)
sys.exit(app.exec_())
而且,发现删除耗时程序worker()
和回调函数后,进度条能一直到99%并卡住?