Читаем QT 4: программирование GUI на С++ полностью

04 QDataStream out(█, QIODevice::WriteOnly);

05 out.setVersion(QDataStream::Qt_4_1);

06 out << quint16(0) << quint8('S') << fromComboBox->currentText

07 << toComboBox->currentText << dateEdit->date

08 << timeEdit->time;

09 if (departureRadioButton->isChecked) {

10 out << quint8('D');

11 } else {

12 out << quint8('A');

13 }

14 out.device->seek(0);

15 out << quint16(block.size - sizeof(quint16));

16 tcpSocket.write(block);

17 statusLabel->setText(tr("Sending request..."));

18 }

Слот sendRequest выполняется, когда объект QTcpSocket генерирует сигнал connected, уведомляя об установке соединения. Задача этого слота — сгенерировать запрос к серверу с передачей всей введенной пользователем информации.

Запрос является двоичным блоком следующего формата:

• quint16 — размер блока в байтах (не учитывая данное поле),

• quint8 — тип запроса (всегда «S»),

• QString — пункт отправления,

• QString — пункт прибытия,

• QDate — дата поездки,

• QTime — примерное время отправления или прибытия,

• quint8 — признак времени отправления («D») или прибытия («А»).

Сначала мы записываем данные в массив типа QByteArray с именем block. Мы не можем писать данные непосредственно в QTcpSocket, поскольку мы не знаем размер блока, который будет отсылаться первым, пока не разместим все данные в блоке.

Сначала мы записываем 0 в поле размера блока и затем размещаем остальные данные. Затем мы делаем вызов seek(0) для устройства ввода—вывода (для установки на начало буфера QBuffer, создаваемого автоматически классом QDataStream), чтобы встать на начало массива байтов и переписать первоначальный 0 фактическим размером блока данных. Эта величина рассчитывается как размер блока за вычетом sizeof(quint16) (то есть 2), чтобы исключить поле с размером блока из общей суммы байтов. После этого мы вызываем функцию write для объекта QTcpSocket, чтобы отослать этот блок на сервер.

01 void TripPlanner::updateTableWidget

02 {

03 QDataStream in(&tcpSocket);

04 in.setVersion(QDataStream::Qt_4_1);

05 forever {

06 int row = tableWidget->rowCount;

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"))

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже