По поводу qWait(int msec) ничего сказать не могу, никогда ее не использовал. Хотя в ассистенте написано, что Gui и сетевой интерфейс она не блокирует. Правильно ли это тянуть с собой в приложении функционал из QTestLib?
Мне не совсем понятно, что значит "весь ответ". У Вас есть критерий, по которомы Вы можете определить, что все ожидаемые данные получены? Или единственным критерием будет являться то, что в соккет какое-то время данные не поступают.
В любом случае, я вижу только два пути. Первое - организовать все через блокирующую функцию waitForReadyRead(int msecs), т.е. примерно так
const QStringList & getAnswer(const QString &cmd) {
socket.write(qPrintable(cmd));
socket.flush();
QStringList strlist;
forever {
if(waitForReadyRead(1000)) {
strlist << socket.read(socket.bytesAvailable());
} else break;
}
return strlist;
}
Что, как сами понимаете, делать не стОит, т.к. Gui будет заблокированно на неопределенное время. (Хотя всегда можно добавить qApp->processEvents(). Но мне такой подход не нравится.)
Во втором случае - это, как уже предлогалось, сделать все это в дочернем потоке. Правда структура проекта будет несколько иной, что Вы изначально хотели.
void ThreadSocket::run()
{
QStringList strlist;
emit SendServer("cmd"); // отправляем данные для записи в соккет
QMutexLocker locker(&mutex);
forever {
if ( cond.wait(&mutex, 1000) ) {
strlist << DataIn; // DataIn - данные полученные по соккету, в обработчике события readyRead()
DataIn.clear();
} else break;
}
emit sendData(strlist); // отправляем полученные данные.
}
P.S. Коды не компилил. Надеюсь сильно нигде не облажался