Как исправить вылет QMessageBox при запуске из другого потока?
Доброго времени суток!
Очень странная проблемма: если из другого вызвать статические методы QMessageBox (information(), warning(), critical()), то приложение выдаёт runtime ошибку и падает, либо просто падает.
Пробовал в объекте основого потока сделать сигнал и слот для этого. Но как я понял, слот всё равно выполняется в другом потоке и снова ошибка.
Как быть?
Огромное заранее спасибо! Убил уже два дня на поиски решения проблеммы...
К наследникам QWidget можно обращаться только из главного потока.
Вам нужен слот надлежащий главному потоку, в который передавайте данные для сообщения, и в слоте вызывайте QMessageBox.
Подключать QObject::connect надо с двумя объектами или явно указать тип. Если третий параметр пропустить, то по умолчанию произойдет Qt::DirectConnection и слот выполниться в потоке сигнала.
Спасибо за быстрый отклик!!!
Я написал в классе, представляющем гуи проекта, и объект которого находится в основном потоке сигнал и слот. Приконектил их, а потом вызываю из соседнего потока сигнал. Слот по идее должен работать в основном потоке, но почему-то это не так.
Может я что-то не правильно делаю?
Могу прикрепить код
Profi_GMan, QtConcurrent::run вызывает статический метод не в главном потоке. Вам там надо вызывать сигнал. А слот должен быть например в классе Window
Игорь Джулай, Забыл сказать, ещё иногда выдвёт
ASSERT failure in QWidget: Widgets must be created in the GUI thread., file kernel\qwidget.cpp, line 1156
WARNING: QObject::~QObject: Timers cannot be stopped from another thread
но это и есть то, о чём вы говорите
Игорь Джулай, Заработало! Надо было в main() добавить qRegisterMetaType("QtMsgType");
и прописать
connect(this, &Window::logFromMainThread, this, &Window::logFromMainThreadSlot);
(добавить this)
Спасибо вам огромное!! Добавьте это в ваш это ответ и я его помечу решением