Я не совсем понимаю вашу мысль. Поиск производится сразу по всем документам. Если главная нитка будет перебирать все документы и посылать их в SearchThread, то она не сможет реагировать на действия юзера.
Главная нитка запускает SearchThread и делает напр emit SearchDoc(doc[ i ]) столько раз сколько есть документов, после этого она свободна. Посланные документы (указатели) оказались в очереди событий (EventLoop) SearchThread, т.е. документы для поиска ему приходят один за одним
Также главная нитка может послать NULL документ. Увидев его SearchThread понимает - больше доков не будет и выходит из run послав сигнал "поиск завершен"