Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«QT 4: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ GUI Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 85

Автор Жасмин Π‘Π»Π°Π½ΡˆΠ΅Ρ‚

Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ 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 }

Π‘Π»ΠΎΡ‚ processPendingDatagrams() вызываСтся ΠΏΡ€ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹. QUdpSocket ставит Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠΈΠ΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ позволяСт ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ ΠΊ Π½ΠΈΠΌ доступ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π² порядкС ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ°, ΠΎΠ΄Π½Π°ΠΊΠΎ нСльзя ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ Π΄ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ сигнала readyRead(). Π’ этом случаС ΠΌΡ‹ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅ΠΌ всС Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΡ€ΠΎΠΌΠ΅ послСднСй, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ содСрТат ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ атмосфСрного состояния.

Ѐункция pendingDatagramSize() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΆΠ΄ΡƒΡ‰Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹. Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния прилоТСния Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ всСгда ΠΏΠΎΡΡ‹Π»Π°ΡŽΡ‚ΡΡ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ Π±Π»ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ…. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ любом количСствС Π±Π°ΠΉΡ‚ΠΎΠ² Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ. Π’Ρ‹Π·ΠΎΠ² readDatagram() ΠΊΠΎΠΏΠΈΡ€ΡƒΠ΅Ρ‚ содСрТимоС ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΆΠ΄ΡƒΡ‰Π΅ΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ Π±ΡƒΡ„Π΅Ρ€ char * (обрСзая Π΄Π°Π½Π½Ρ‹Π΅, Ссли Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΡƒΡ„Π΅Ρ€Π° оказываСтся нСдостаточным) ΠΈ осущСствляСт ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π½Π΅ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠΉ Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΠ΅. ПослС считывания всСх Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌ ΠΌΡ‹ Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅ΠΌ послСднюю ΠΈΠ· Π½ΠΈΡ… (ΠΈΠΌΠ΅ΡŽΡ‰ΡƒΡŽ самыС свСТиС значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² атмосфСрного состояния) Π½Π° составныС части ΠΈ заполняСм строки рСдактирования QLineEdit Π½ΠΎΠ²Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ.

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

02 {

03 QApplication app(argc, argv);

04 WeatherStation station;

05 station.show();

06 return app.exec();

07 }

НаконСц, Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() ΠΌΡ‹ создаСм ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ WeatherStation.

На этом ΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ рассмотрСниС Π½Π°ΡˆΠΈΡ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² ΠΏΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΈ ΠΏΡ€ΠΈΠ΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° UDP. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½Ρ‹Π΅ прилоТСния максимально ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Ρ‹, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Weather Balloon посылаСт Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹, Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Weather Station ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΡ…. Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² ΠΎΠ±ΠΎΠΈΡ… случаях ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ ΠΊΠ°ΠΊ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° свой сокСт. Ѐункциям QUdpSocket::writeDatagram() ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ адрСс хоста ΠΈ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎΡ€Ρ‚Π°, поэтому QUdpSocket ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ с хоста ΠΈ ΠΏΠΎΡ€Ρ‚Π°, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΎΠ½ Π±Ρ‹Π» связан Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ bind(), ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ хост ΠΈ ΠΏΠΎΡ€Ρ‚.

Π“Π»Π°Π²Π° 15. XML

XML (Extensible Markup Language β€” Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌΡ‹ΠΉ язык Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΈ) β€” это ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ распространСниС ΠΏΡ€ΠΈ ΠΎΠ±ΠΌΠ΅Π½Π΅ ΠΈ Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ…. Qt обСспСчиваСт Π΄Π²Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… интСрфСйса для чтСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² XML; эти интСрфСйсы входят Π² состав модуля QtXml:

β€’ SAX (Simple API for XML β€” простой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс для Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² XML) позволяСт ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ «события синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Β» нСпосрСдствСнно Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… функциях.

β€’ DOM (Document Object Model β€” ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Π°Ρ модСль Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°) ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ XML Π² структуру Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π°, которая Π·Π°Ρ‚Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ.

БущСствуСт ΠΌΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌ случаС ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ DOM ΠΈ SAX. SAX являСтся интСрфСйсом Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΎΠ³ΠΎ уровня ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ быстрСС, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ особСнно ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΌ ΠΊΠ°ΠΊ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ простых Π·Π°Π΄Π°Ρ‡ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для поиска Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ XML всСх ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚Π΅Π³Π°), Ρ‚Π°ΠΊ ΠΈ для чтСния ΠΎΡ‡Π΅Π½ΡŒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти. Но для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ удобство примСнСния DOM ΠΏΠ΅Ρ€Π΅Π²Π΅ΡˆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ прСимущСства Π±ΠΎΠ»Π΅Π΅ высокого быстродСйствия ΠΈ Π±ΠΎΠ»Π΅Π΅ эффСктивного использования памяти Π² SAX.

Π‘ΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ XML ΠΌΠΎΠΆΠ½ΠΎ двумя способами: ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ XML Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΈΠ»ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π° DOM, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Π² памяти, ΠΈ Β«ΠΏΠΎΠΏΡ€ΠΎΡΠΈΡ‚ΡŒΒ» это Π΄Π΅Ρ€Π΅Π²ΠΎ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сСбя Π² Ρ„Π°ΠΉΠ».

Π§Ρ‚Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² XML ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ интСрфСйса SAX

SAX являСтся фактичСским стандартом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ интСрфСйса с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ обСспСчиваСт Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² XML.

ΠšΠ»Π°ΡΡΡ‹ Qt для интСрфСйса SAX ΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΡƒΡŽΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ SAX2 Java с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ отличиями Π² названиях для обСспСчСния принятых Π² Qt ΠΏΡ€Π°Π²ΠΈΠ» ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π½Π°Π·Π²Π°Π½ΠΈΠΉ классов ΠΈ ΠΈΡ… Ρ‡Π»Π΅Π½ΠΎΠ². Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ SAX ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π² сСти Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΏΠΎ адрСсу http://www.saxproject.org/.

Qt обСспСчиваСт построСнный Π½Π° основС интСрфСйса SAX парсСр Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² XML, Π½Π΅ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΈΡ… достовСрности ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ QXmlSimpleReader. Π­Ρ‚ΠΎΡ‚ парсСр распознаСт Ρ…ΠΎΡ€ΠΎΡˆΠΎ сформированныС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹ XML ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ пространства ΠΈΠΌΠ΅Π½ XML. Когда парсСр ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚, ΠΎΠ½ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² зарСгистрированных классах—обработчиках, ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡŽΡ‰ΠΈΡ… ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… событий Π² Ρ…ΠΎΠ΄Π΅ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°. (Π­Ρ‚ΠΈ события Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ связаны с Ρ‚Π°ΠΊΠΈΠΌΠΈ событиями Qt, ΠΊΠ°ΠΊ события ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Ρ‹ ΠΈ события ΠΌΡ‹ΡˆΠΊΠΈ.) НапримСр, ΠΏΡƒΡΡ‚ΡŒ парсСр выполняСт Π°Π½Π°Π»ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π° XML:

<doc>

<quote> Ars longa vita brevis</quote>

</doc>

Π’ этом случаС парсСр Π²Ρ‹Π·ΠΎΠ²Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°:

startDocument()

startElement("doc")

startElement("quote")

characters("Ars longa vita brevis")

endElement("quote")

endElement("doc")

endDocument()

ВсС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ Π² классС QXmlContentHandler. Для простоты ΠΌΡ‹ Π½Π΅ стали ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ startElement() ΠΈ endElement().

QXmlContentHandler β€” это всСго лишь ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠ½ΠΎΠ³ΠΈΡ… классов—обработчиков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ совмСстно с классом QXmlSimpleReader. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚Π°ΠΊΠΈΠΌΠΈ классами ΡΠ²Π»ΡΡŽΡ‚ΡΡ QXmlEntityResolver, QXmlDTDHandler, QXmlErrorHandler, QXmlDeclHandler ΠΈ QXmlLexicalHandler. Π­Ρ‚ΠΈ классы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ чистыС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… событиях синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°. Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²ΠΏΠΎΠ»Π½Π΅ достаточно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ лишь классы QXmlContentHandler ΠΈ QXmlErrorHandler.