Я хочу испустить сигнал из потока C ++ (std :: thread) в Qt.
Как мне это сделать?
Вы определенно можете испустить сигнал из потока (QThread
, std::thread
или даже boost::thread
). Только вы должны быть осторожны с пятым параметром вашей функции подключения (Qt::ConnectionType
):
Если Qt::DirectConnection
: Слот вызывается немедленно (из текущего потока), когда испускается сигнал.
Если Qt::QueuedConnection
: Слот вызывается, когда управление возвращается в цикл обработки событий получателя. Слот выполняется в потоке получателя.
Увидеть ConnectionType-перечисление для большего количества вариантов.
Проблема не в том, из какого потока вы посылаете сигнал, а в том, из какого потока вызывается слот. Например, я думаю, QLabel::setText
должен быть выполнен из QLabel
Тема владельца (скорее всего основная). Так что, если вы излучаете сигнал, связанный с QLabel
«s setText
из потока, соединение должно быть сделано с Qt::AutoConnection
, Qt::QueuedConnection
или же Qt::BlockingQueuedConnection
,
Вы, вероятно, не должны излучать сигнал Qt от std::thread
-создана нить в общем без заботы. Увидеть Jpo38 ответ : тип соединения имеет значение и т. д …
Если поток выполняет какой-то цикл событий Qt, вы, вероятно, могли бы. Увидеть темы и QObject
Существует (вероятно, для Unix) обходной путь, который делает то же самое, что и для Unix сигналы с Qt : используйте трубу из вашего std::thread
в основной поток.
Но, как прокомментировал Иоахим Пилеборг, ты должен сделать свой собственный QThread. Это самый простой и, вероятно, самый короткий (с точки зрения исходного кода), и вам просто нужно скопировать и вставить существующий пример и адаптировать его к вашим потребностям.
Остерегайтесь, что AFAIK только основная нить должен делать манипуляции с Qt GUI. Вы не должны использовать QWidget (и т. Д.) Вне основного потока! (Кстати, GTK имеет такое же ограничение, по крайней мере, в Linux: только основной поток должен использовать X системные протоколы Windows)
Если вы держите указатель на свой QObject, вы можете использовать один из QMetaObject::invokeMethod
член http://qt-project.org/doc/qt-5/qmetaobject.html#invokeMethod
Вероятно, вам придется использовать Qt::QueuedConnection
поэтому ваш сигнал будет вызываться в правильном потоке (не в вашем std :: thread). Помните, что ваш сигнал не будет активирован немедленно.