QMessageBox не может быть использован из другого потока напрямую. В Qt все операции GUI должны выполняться в главном потоке приложения. Если вы хотите показать QMessageBox из другого потока, вам нужно отправить сигнал в главный поток и показать QMessageBox в обработчике этого сигнала. Для этого можно использовать механизм сигналов и слотов в Qt. Вот пример:
```python
from PyQt5.QtCore import Qt, QThread, pyqtSignal
from PyQt5.QtWidgets import QApplication, QMessageBox
# Наш класс потока
class MyThread(QThread):
# Определяем сигнал, который будет отправляться в главный поток
show_message_signal = pyqtSignal()
def run(self):
# Выполняем какую-то работу в другом потоке
# ...
# Когда нужно показать QMessageBox, отправляем сигнал
self.show_message_signal.emit()
# Класс главного окна
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
# Инициализируем поток
self.thread = MyThread()
# Привязываем сигнал к обработчику
self.thread.show_message_signal.connect(self.show_message)
# Запускаем поток
self.thread.start()
def show_message(self):
# Показываем QMessageBox в главном потоке
QMessageBox.information(self, 'Message', 'Hello from other thread!')
app = QApplication([])
window = MainWindow()
window.show()
app.exec_()
```
Таким образом, мы создаем свой собственный класс потока, который имеет сигнал `show_message_signal`. Когда метод `run()` выполняется, мы отправляем этот сигнал в главный поток. В главном окне мы соединяем этот сигнал с методом `show_message()`, который показывает QMessageBox.