首先给出实现效果:
pyqt实现定时关闭弹窗和跳转页面
实现方法:
在需要使用的窗口类增加QTimer和QMessageBox对象,也可以放在全局里或别的类里,但需要能随时调用到这两个对象。
# 两个类的包,pyqt5应该也是在这里面,改个数字就行
from PyQt6.QtCore import QTimer
from PyQt6.QtWidgets import QMessageBox
# 这个是需要使用该功能的窗口类
class LoginWindow(QWidget, Ui_Login):
def __init__( self, parent=None):
super(LoginWindow, self).__init__(parent)
self.setupUi(self)
self.initUI()
# 这两个是需要的工具对象
self.timer = QTimer()
self.info_box = QMessageBox()
然后在需要使用弹出并定时关闭窗口的地方加入这段代码:
try:
# 设置info_box的详细信息,这里只设置了标题和提示文字
title = "登录成功!"
text = "3秒后返回登录页面"
self.info_box.setWindowTitle(title) # QMessageBox标题
self.info_box.setText(text) # QMessageBox的提示文字
# 展示弹窗
self.info_box.show()
# 设置 QMessageBox 自动关闭时长
delay = 3000
self.timer.singleShot(delay, self.registerSuccess) # 延时delay ms后执行self.registerSuccess函数
# 上面的延时等待异步执行,因此在延时过程中,会继续向后执行代码
# ...
except Exception as e:
print(e)
这里使用了timer对象的singleShot方法,延时delay毫秒后执行传入的函数(注意延时是异步执行!延时过程中会继续向后执行),这里我设置的在注册完成后执行窗口类里的resgisterSuccess()函数。
假如只是想延时关闭弹出的窗口,那么直接将上面的self.timer.singleShot()函数改为匿名函数即可:
self.timer.singleShot(delay, lambda: self.info_box.close())
如果想在关闭弹出窗口后执行其他操作,则需要定义一个延时之后执行的函数(因为singleShot异步执行,所以不能把剩下的代码写在函数之后),这里给出我写的registerSuccess函数作为参考:
def registerSuccess(self):
# 关闭弹出串口前要做的事
# ...
# 关闭弹出窗口
self.info_box.close()
# 关闭弹出窗口后要做的事
self.toLogin() # 注册完成跳转回登录页面的函数