QMessageBox无法在线程中使用
时间: 2023-08-28 14:14:47 浏览: 139
利用PyQt中的QThread类实现多线程
您好!对于在线程中使用 QMessageBox,可以通过以下方法解决:
1. 在子线程中发送信号,然后在主线程中使用 QMessageBox。
```python
from PyQt5.QtCore import QThread, pyqtSignal
from PyQt5.QtWidgets import QMessageBox
class WorkerThread(QThread):
finished = pyqtSignal()
def run(self):
# 在这里执行耗时操作
self.finished.emit()
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.thread = WorkerThread()
self.thread.finished.connect(self.show_message_box)
def show_message_box(self):
QMessageBox.information(self, "提示", "耗时操作已完成!")
def start_work(self):
self.thread.start()
```
2. 使用 QMetaObject.invokeMethod() 在主线程中调用 QMessageBox。
```python
from PyQt5.QtCore import QObject, QThread, pyqtSignal, QMetaObject
class WorkerThread(QThread):
finished = pyqtSignal()
def run(self):
# 在这里执行耗时操作
QMetaObject.invokeMethod(main_window, "show_message_box")
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
def show_message_box(self):
QMessageBox.information(self, "提示", "耗时操作已完成!")
def start_work(self):
self.thread = WorkerThread()
self.thread.finished.connect(self.show_message_box)
self.thread.start()
```
这些方法都是将显示 QMessageBox 的操作放在主线程中执行,以避免在线程中直接使用 QMessageBox 导致的问题。希望对您有所帮助!
阅读全文