qt5的QMainWindow退出,QMainWindow下的多线程 线程没有退出的解决办法,请用示例表述
时间: 2024-03-09 21:46:42 浏览: 65
Qt5 多线程
当一个 PyQt5 中的 QMainWindow 被关闭时,QApplication 会终止并关闭所有的线程。但是如果这些线程被阻塞,或者在执行某些操作时无法正常退出,那么它们可能会继续运行,甚至在主窗口关闭后继续运行,导致程序无法完全退出。
为了避免这种情况,我们可以在 QMainWindow 的 closeEvent() 事件中手动停止所有的线程。例如:
```python
import sys
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
class Worker(QThread):
finished = pyqtSignal()
def __init__(self):
super().__init__()
def run(self):
# 模拟长时间运行的任务
import time
time.sleep(5)
self.finished.emit()
class MyMainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.worker = None
self.setup_ui()
def setup_ui(self):
self.setWindowTitle("Main Window")
self.setGeometry(100, 100, 300, 200)
btn_start = QPushButton("Start", self)
btn_start.move(100, 50)
btn_start.clicked.connect(self.start_worker)
btn_exit = QPushButton("Exit", self)
btn_exit.move(100, 100)
btn_exit.clicked.connect(self.close)
def start_worker(self):
self.worker = Worker()
self.worker.finished.connect(self.worker_finished)
self.worker.start()
def worker_finished(self):
print("Worker finished.")
def closeEvent(self, event):
if self.worker is not None and self.worker.isRunning():
self.worker.quit()
self.worker.wait()
event.accept()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MyMainWindow()
window.show()
sys.exit(app.exec_())
```
在这个示例中,我们创建了一个长时间运行的 QThread,当点击按钮时启动它。在关闭主窗口时,我们检查线程是否正在运行,如果是,我们使用 quit() 方法停止线程并等待线程退出,这样我们就可以确保所有的线程都被正常终止了。
阅读全文