07 if (nextBlockSize == 0) {
08 if (tcpSocket.bytesAvailable() < sizeof(quint16))
09 break;
10 in >> nextBlockSize;
11 }
12 if (nextBlockSize == 0xFFFF) {
13 closeConnection();
14 statusLabel->setText(tr("Found %1 trip(s)").arg(row));
15 break;
16 }
17 if (tcpSocket.bytesAvailable() < nextBlockSize)
18 break;
19 QDate date;
20 QTime departureTime;
21 QTime arrivalTime;
22 quint16 duration;
23 quint8 changes;
24 QString trainType;
25 in >> date >> departureTime >> duration >> changes >> trainType;
26 arrivalTime = departureTime.addSecs(duration * 60);
27 tableWidget->setRowCount(row + 1);
28 QStringList fields;
29 fields << date.toString(Qt::LocalDate)
30 << departureTime.toString(tr("hh:mm"))
31 << arrivalTime.toString(tr("hh:mm"))
32 << tr("%1 hr %2 min").arg(duration / 60).arg(duration % 60)
33 << QString::number(changes) << trainType;
34 for (int i = 0; i < fields.count(); ++i)
35 tableWidget->setItem(row, i, new QTableWidgetItem(fields[i]));
36 nextBlockSize = 0;
37 }
38 }
Слот
Сервер пересылает нам список возможных железнодорожных рейсов, которые удовлетворяют критерию пользователя. Каждый рейс передается в виде одного блока, и каждый блок начинается с поля размера блока. Цикл
Итак, как действует цикл
Если размер блока не равен 0xFFFF, мы пытаемся считать следующий блок. Во-первых, мы проверяем наличие блока байтов необходимого размера. Если его нет, мы прерываем цикл. Сигнал
Если мы уверены, что получен целый блок, мы можем спокойно использовать оператор
В конце мы вновь устанавливаем переменную
01 void TripPlanner::closeConnection()
02 {
03 tcpSocket.close();
04 searchButton->setEnabled(true);
05 stopButton->setEnabled(false);