使用pyqt6实现一个用户在执行耗时操作时的等待弹窗。只有在耗时操作执行完成时,该弹窗才会自动消失,否则禁止用户操作界面。如何实现?
时间: 2024-04-09 08:27:42 浏览: 195
要实现一个用户在执行耗时操作时的等待弹窗,并在耗时操作完成后自动消失,您可以使用QProgressDialog和QEventLoop来实现。
以下是一个示例代码:
```python
from PyQt6.QtWidgets import QApplication, QProgressDialog
from PyQt6.QtCore import QEventLoop, QTimer
import time
app = QApplication([])
progressDialog = QProgressDialog()
progressDialog.setWindowTitle("请稍候")
progressDialog.setCancelButton(None)
progressDialog.setRange(0, 0) # 设置进度范围为无限
progressDialog.show()
# 创建一个事件循环
eventLoop = QEventLoop()
# 模拟耗时操作的函数
def longRunningOperation():
time.sleep(5) # 模拟耗时操作
# 创建一个定时器,用于检查耗时操作是否完成
timer = QTimer()
timer.setSingleShot(True)
# 定时器超时后执行的函数
def checkOperation():
# 检查耗时操作是否完成
if not eventLoop.isRunning():
progressDialog.close() # 关闭进度对话框
timer.stop() # 停止定时器
# 连接定时器的timeout信号到checkOperation函数
timer.timeout.connect(checkOperation)
# 启动定时器
timer.start(100)
# 启动耗时操作
eventLoop.exec(longRunningOperation)
app.exec()
```
在这个例子中,我们首先创建了一个QProgressDialog,并设置了窗口标题和取消按钮。将进度范围设置为无限,通过设置范围为(0, 0)来实现。然后,我们调用`show`函数来显示进度对话框。
接下来,我们创建了一个QEventLoop作为事件循环,用于等待耗时操作完成。然后,我们创建了一个QTimer定时器,间隔时间设置为100毫秒。定时器的timeout信号连接到了一个检查耗时操作是否完成的函数checkOperation。
在耗时操作开始之前,我们启动了定时器,并通过调用`eventLoop.exec(longRunningOperation)`来启动耗时操作,并将事件循环与耗时操作关联起来。
在定时器的checkOperation函数中,我们检查事件循环是否正在运行(即耗时操作是否完成),如果完成,则关闭进度对话框并停止定时器。
当耗时操作完成后,QEventLoop将停止运行,定时器的checkOperation函数将检测到事件循环停止,并关闭进度对话框。
请注意,示例中的耗时操作`longRunningOperation`是一个简单的`time.sleep(5)`,您可以将其替换为您自己的耗时操作函数。
希望这可以帮助到您!
阅读全文