我检测到代码执行到了弹出对话框的代码,但是不能弹出,而且主窗口处于卡住的状态
时间: 2024-02-22 16:59:14 浏览: 20
那可能是因为主窗口处于事件循环中,而代码阻塞了事件循环,导致主窗口无法响应用户的操作,从而出现了卡住的状态。
你可以尝试将弹出对话框的代码放在一个单独的线程中执行,这样就不会阻塞主线程的事件循环了。例如:
```
from PyQt5.QtCore import QThread, pyqtSignal
class DialogThread(QThread):
dialog_signal = pyqtSignal(bool)
def __init__(self, parent, message):
super(DialogThread, self).__init__(parent)
self.message = message
def run(self):
reply = QMessageBox.question(None, "询问", self.message, QMessageBox.Ok, QMessageBox.Cancel)
if reply == QMessageBox.Ok:
self.dialog_signal.emit(True)
else:
self.dialog_signal.emit(False)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
self.setupUi(self)
def on_button_clicked(self):
x = ["前提1", "前提2", "前提3"]
for i in x:
if i not in self.DB:
thread = DialogThread(self, "是否" + i + "?")
thread.dialog_signal.connect(self.dialog_finished)
thread.start()
thread.wait()
def dialog_finished(self, result):
if result:
self.textEdit_2.setText(self.textEdit_2.toPlainText() + "\n" + i)
self.DB.add(i)
flag1 = True
```
在这个例子中,我们创建了一个DialogThread类,继承自QThread,用于在单独的线程中执行弹出对话框的代码。当对话框关闭时,发出一个dialog_signal信号,通知主线程对话框的结果。主线程通过连接dialog_signal信号来接收对话框的结果,并执行相应的操作。注意,我们在主线程中使用了wait()函数来等待线程结束,这样可以保证弹出对话框的顺序。
这样就可以避免阻塞主线程的事件循环,从而解决了主窗口卡住的问题。