В Qt вы не можете (или не должны) вызывать любые функции графического интерфейса в другом потоке, отличном от основного потока. Что вы можете сделать, это отправить сигнал в рабочий поток и получить его в основном потоке.
Например, если вы после создания цепочки просто позвоните
connect(thread, SIGNAL(newText(QString)), lineEdit, SLOT(setText(QString)));
По умолчанию будет установлено соединение типа Qt::AutoConnection
. Всякий раз, когда вы излучаете сигнал в том же потоке, где живет приемник, это эквивалентно простому вызову функции. Но когда вы посылаете этот сигнал в другой поток (например, в ваш новый поток), он ставится в очередь, а затем доставляется, когда основной поток снова запланирован, и продолжает свой цикл обработки событий, и поэтому функция слота всегда будет вызываться в потоке, где Ресивер живет. Но убедитесь, что вы объявляете сигнал с параметром значения (без указателя или ссылки), так что вы действительно получаете копию QString
, а не указатель / ссылку на строку потока (которая, возможно, уже была перезаписана потоком ). * +1008 *
...
signals:
void newText(QString);
...
Вы также можете настроить соединение так, чтобы поток ожидал (блокирует) после излучения, пока приемник не завершит обработку сигнала (вернувшегося из функции слота), используя Qt::BlockingQueuedConnection
в качестве типа соединения. Но в вашем случае это не должно быть необходимым.
Дополнительную информацию смотрите в превосходной документации Qt .