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

















