Какая возможность использования QMessageBox из другого потока?

  • 15 ноября 2023 г. 8:49
Ответы на вопрос 2
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.
Транслируйте сигнал из одного потока в другой, чтобы вызвать диалоговое окно без необходимости перетаскивать его.
Похожие вопросы