pyqt5写一个提示信息框,有倒计时功能,弹出提示信息时,不能影响主线程里的操作。
时间: 2023-08-04 20:05:23 浏览: 175
可以使用QMessageBox和QTimer来实现提示信息框和倒计时功能,并使用QThread来实现在弹出提示信息框时不影响主线程的操作。
以下是示例代码:
```python
from PyQt5.QtWidgets import QMessageBox, QApplication
from PyQt5.QtCore import QTimer, QThread, pyqtSignal
import sys
class TimerThread(QThread):
"""
定义一个计时器线程
"""
timeout = pyqtSignal() # 自定义信号
def __init__(self, parent=None):
super(TimerThread, self).__init__(parent)
self.flag = False
def run(self):
self.flag = True
while self.flag:
self.timeout.emit() # 发送自定义信号
self.sleep(1)
def stop(self):
self.flag = False
class MessageBox(QMessageBox):
"""
定义一个提示信息框,继承自QMessageBox
"""
def __init__(self, parent=None):
super(MessageBox, self).__init__(parent)
self.timer_thread = TimerThread()
self.timer_thread.timeout.connect(self.update_countdown)
self.countdown = 5 # 倒计时时间
def showEvent(self, event):
"""
重写showEvent函数,在弹出提示信息框时启动计时器线程
"""
self.timer_thread.start()
super(MessageBox, self).showEvent(event)
def update_countdown(self):
"""
更新倒计时时间
"""
self.countdown -= 1
self.setInformativeText(f"将在 {self.countdown} 秒后关闭")
if self.countdown == 0:
self.timer_thread.stop()
self.done(0)
def closeEvent(self, event):
"""
重写closeEvent函数,在关闭提示信息框时停止计时器线程
"""
self.timer_thread.stop()
super(MessageBox, self).closeEvent(event)
if __name__ == '__main__':
app = QApplication(sys.argv)
msg_box = MessageBox()
msg_box.setText("这是一个提示信息框")
msg_box.setStandardButtons(QMessageBox.Ok)
msg_box.setDefaultButton(QMessageBox.Ok)
msg_box.exec_()
sys.exit(app.exec_())
```
在上面的代码中,我们定义了一个TimerThread类,继承自QThread,用于实现计时器功能。在计时器线程中,使用while循环和sleep函数实现每隔1秒发送一次自定义信号timeout。
我们还定义了一个MessageBox类,继承自QMessageBox,用于实现提示信息框和倒计时功能。在showEvent函数中,启动计时器线程;在update_countdown函数中,更新倒计时时间,并判断倒计时是否结束;在closeEvent函数中,停止计时器线程。
最后,在主函数中创建一个MessageBox对象,并设置提示信息、按钮等属性,调用exec_()函数显示提示信息框。
注意,如果在Qt中需要进行UI操作,则需要在主线程中进行,所以我们需要使用QThread来实现计时器线程。
阅读全文