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

В отличие от QAbstractSocket, класс QUdpSocket не получает имена хостов, а только их числовые адреса. Если нам нужно определить имя хоста по его адресу IP, мы имеем две возможности. Если мы готовы блокировать работу во время выполнения поиска, мы можем использовать статическую функцию QHostInfo::fromName. В противном случае мы можем использовать статическую функцию QHostInfo::lookupHost, которая немедленно возвращает управление и вызывает слот с передачей в качестве аргумента объекта QHostInfo, который будет содержать соответствующие адреса после завершения поиска.

01 int main(int argc, char *argv[])

02 {

03 QApplication app(argc, argv);

04 WeatherBalloon balloon;

05 balloon.show;

06 return app.exec;

07 }

Функция main просто создает объект WeatherBalloon, кoтopый являeтcя yчacтником связи по протоколу UDP и одновременно представлен на экране кнопкой QPushButton. Нажимая кнопку QPushButton, пользователь может завершить приложение.

Теперь давайте рассмотрим исходный код клиентского приложения Weather Station.

01 class WeatherStation : public QDialog

02 {

03 Q_OBJECT

04 public:

05 WeatherStation(QWidget *parent = 0);

06 private slots:

07 void processPendingDatagrams;

08 private:

09 QUdpSocket udpSocket;

10 QLabel *dateLabel;

11 QLabel *timeLabel;

12 QLineEdit *altitudeLineEdit;

13 };

Класс WeatherStation наследует QDialog. Он прослушивает определенный порт UDP, выполняет синтаксический разбор поступающих дейтаграмм (от приложения Weather Balloon) и выводит на экран их содержимое в виде пяти строк редактирования QLineEdit, которые используются только для вывода данных. Здесь нас интересует только одна закрытая переменная udpSocket типа QUdpSocket, которая будет использована для приема дейтаграмм.

01 WeatherStation::WeatherStation(QWidget *parent)

02 : QDialog(parent)

03 {

04 udpSocket.bind(5824);

05 connect(&udpSocket, SIGNAL(readyRead),

06 this, SLOT(processPendingDatagrams));

07 }

Конструктор мы начинаем с привязки объекта QUdpSocket к порту, на который передает данные метеозонд. Поскольку мы не указали адрес хоста, сокет будет принимать дейтаграммы, посланные на любой адрес IP, принадлежащий машине, на которой работает приложение Weather Station. Затем мы связываем сигнал сокета readyRead c закрытым слотом processPendingDatagrams, который извлекает данные и отображает их на экране.

01 void WeatherStation::processPendingDatagrams

02 {

03 QByteArray datagram;

04 do {

05 datagram.resize(udpSocket.pendingDatagramSize);

06 udpSocket.readDatagram(datagram.data, datagram.size);

07 } while (udpSocket.hasPendingDatagrams);

08 QDateTime dateTime;

09 double temperature;

10 double humidity;

11 double altitude;

12 QDataStream in(&datagram, QIODevice::ReadOnly);

13 in.setVersion(QDataStream::Qt_4_1);

14 in >> dateTime >> temperature >> humidity >> altitude;

15 dateLineEdit->setText(dateTime.date.toString);

16 timeLineEdit->setText(dateTime.time.toString);

17 temperatureLineEdit->setText(tr("%1° C").arg(temperature));

18 humidityLineEdit->setText(tr("%1%").arg(humidity));

19 altitudeLineEdit->setText(tr("%1 m").arg(altitude));

20 }

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