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

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

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

header.setValue("Host", "www.trolltech.com");

header.setContentType("application/x-www-form-urlencoded");

http.setHost(www.trolltech.com);

http.request(header, "qt-interest=on&search=opengl");

QHttp Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигнал requestStarted(int) Π² Π½Π°Ρ‡Π°Π»Π΅ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ сигнал requestFinished(int, bool) послС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ выполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Ρ‚ΠΈΠΏΠ° int являСтся числом, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ запрос. Если ΠΌΡ‹ собираСмся ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ выполнСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… запросов, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ эти ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€ΠΈ постановкС запросов Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ. ΠžΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² обСспСчиваСт Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ связь с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ.

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ нас интСрСсуСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ исполнСния всСй ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄. Π­Ρ‚ΠΎ Π»Π΅Π³ΠΊΠΎ достигаСтся ΠΏΡƒΡ‚Π΅ΠΌ подсоСдинСния сигнала done(bool), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ гСнСрируСтся всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ запросов становится пустой.

ΠŸΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ запросов автоматичСски очищаСтся. Но Ссли ΠΌΡ‹ послС возникновСния ошибки Π·Π°Π΄Π°Π΄ΠΈΠΌ Π½ΠΎΠ²Ρ‹Π΅ запросы с использованиСм Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QHttp, ΠΎΠ½ΠΈ Π±ΡƒΠ΄ΡƒΡ‚ поставлСны Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ Π² ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌ порядкС.

Как ΠΈ QFtp, класс QHttp содСрТит сигнал readyRead(), Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ read() ΠΈ readAll(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто указания устройства Π²Π²ΠΎΠ΄Π°β€”Π²Ρ‹Π²ΠΎΠ΄Π°.

НаписаниС клиСнт—сСрвСрных ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π±Π°Π·Π΅ TCP

ΠšΠ»Π°ΡΡΡ‹ QTcpSocket ΠΈ QTcpServer ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠ² ΠΈ сСрвСров TCP. TCP β€” это транспортный ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ составляСт основу Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Ρ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ² сСти Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ FTP ΠΈ HTTP, ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для создания ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ².

TCP являСтся ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ. Для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π² Π²ΠΈΠ΄Π΅ большого ΠΏΠΎΡ‚ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡ‡Π΅Π½ΡŒ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡŽΡ‰Π΅Π³ΠΎ большой ΠΎΠ΄Π½ΠΎΡ€ΠΎΠ΄Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ высокого уровня, построСнныС Π½Π° основС TCP, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»ΠΈΠ±ΠΎ строкоориСнтированными, Π»ΠΈΠ±ΠΎ Π±Π»ΠΎΠΊΠΎΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ:

β€’ строкоориСнтированныС ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ тСкстовыС Π΄Π°Π½Π½Ρ‹Π΅ построчно, Π·Π°Π²Π΅Ρ€ΡˆΠ°Ρ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ строку символом ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° Π½ΠΎΠ²ΡƒΡŽ строку;

β€’ Π±Π»ΠΎΠΊΠΎΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ Π΄Π°Π½Π½Ρ‹Π΅ Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ². ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π»ΠΎΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΠΎΠ»Π΅, Π³Π΄Π΅ ΡƒΠΊΠ°Π·Π°Π½ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΠΈΠ΄ΡƒΡ‚ Π±Π°ΠΉΡ‚Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ….

Класс QTcpSocket наслСдуСт QIODevice Ρ‡Π΅Ρ€Π΅Π· класс QAbstractSocket, ΠΈ поэтому Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ с Π½Π΅Π³ΠΎ ΠΈΠ»ΠΈ запись Π½Π° Π½Π΅Π³ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ с ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ срСдств класса QDataStream ΠΈΠ»ΠΈ QTextStream. Одно сущСствСнноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ чтСния Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· сСти ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ достаточного количСства Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΡ‚ партнСрского ΡƒΠ·Π»Π° (peer) ΠΏΠ΅Ρ€Π΅Π΄ использованиСм ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° >>. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСпрСдсказуСмым.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ ΠΌΡ‹ рассмотрим ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈ сСрвСра, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π±Π»ΠΎΡ‡Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ. ΠšΠ»ΠΈΠ΅Π½Ρ‚ называСтся Trip Planner (ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠΉ) ΠΈ позволяСт ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΡΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ»Π°Π½ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΡ Π½Π° ΠΏΠΎΠ΅Π·Π΄Π΅. Π‘Π΅Ρ€Π²Π΅Ρ€ называСтся Trip Server (сСрвСр ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠΉ) ΠΈ обСспСчиваСт ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΏΡƒΡ‚Π΅ΡˆΠ΅ΡΡ‚Π²ΠΈΠΈ. ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с написания клиСнтского прилоТСния Trip Planner.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Trip Planner содСрТит ΠΏΠΎΠ»Π΅ From (ΠΈΠ· ΠΏΡƒΠ½ΠΊΡ‚Π°), ΠΏΠΎΠ»Π΅ To (Π΄ΠΎ ΠΏΡƒΠ½ΠΊΡ‚Π°), ΠΏΠΎΠ»Π΅ Date (Π΄Π°Ρ‚Π°), ΠΏΠΎΠ»Π΅ Approximate Time (ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя) ΠΈ Π΄Π²Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚Π΅Π»Ρ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя отправлСния ΠΈΠ»ΠΈ прибытия. Когда ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Search, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ посылаСт запрос Π½Π° сСрвСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список ΠΆΠ΅Π»Π΅Π·Π½ΠΎΠ΄ΠΎΡ€ΠΎΠΆΠ½Ρ‹Ρ… рСйсов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ критСриям ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π­Ρ‚ΠΎΡ‚ список отобраТаСтся Π² Π²ΠΈΠ΄ΠΆΠ΅Ρ‚Π΅ QTableWidget Π² ΠΎΠΊΠ½Π΅ Trip Planner. Π’ Π½ΠΈΠΆΠ½Π΅ΠΉ части ΠΎΠΊΠ½Π° располоТСны тСкстовая ΠΌΠ΅Ρ‚ΠΊΠ° QLabel, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π°Ρ состояниС послСднСй ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, ΠΈ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ состояния процСсса QProgressBar.

Рис. 14.1. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Π’ΠΏΡ€ Planner.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ интСрфСйс прилоТСния Trip Planner Π±Ρ‹Π» создан ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ QtDesigner Π² Ρ„Π°ΠΉΠ»Π΅ tripplanner.ui. НиТС ΠΌΡ‹ основноС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡƒΠ΄Π΅Π»ΠΈΠΌ исходному ΠΊΠΎΠ΄Ρƒ подкласса QDialog, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ прилоТСния:

#include "ui_tripplanner.h"

01 class TripPlanner : public QDialog, public Ui::TripPlanner

02 {

03 Q_OBJECT

04 public:

05 TripPlanner(QWidget *parent = 0);

06 private slots:

07 void connectToServer();

08 void sendRequest();

09 void updateTableWidget();

10 void stopSearch();

11 void connectionClosedByServer();

12 void error();

13 private:

14 void closeConnection();

15 QTcpSocket tcpSocket;

16 quint16 nextBlockSize;

17 };

Класс TripPlanner наслСдуСт Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ QDialog, Π½ΠΎ ΠΈ Ui::TripPlanner (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ гСнСрируСтся компилятором uic, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„Π°ΠΉΠ» tripplanner.ui). ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρβ€”Ρ‡Π»Π΅Π½ tcpSocket инкапсулируСт соСдинСниС TCP. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ nextBlockSize ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅ Π±Π»ΠΎΠΊΠΎΠ², ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΠ²ΡˆΠΈΡ… с сСрвСра.

01 TripPlanner::TripPlanner(QWidget *parent)

02 : QDialog(parent)

03 {

04 setupUi(this);

05 QDateTime dateTime = QDateTime::currentDateTime();

06 dateEdit->setDate(dateTime.date());

07 timeEdit->setTime(QTime(dateTime.time().hour(), 0));

08 progressBar->hide();

09 progressBar->setSizePolicy(QSizePolicy::Preferred,

10 QSizePolicy::Ignored);

11 tableWidget->verticalHeader()->hide();

12 tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);

13 connect(searchButton, SIGNAL(clicked()),

14 this, SLOT(connectToServer()));

15 connect(stopButton, SIGNAL(clicked()), this, SLOT(stopSearch()));

16 connect(&tcpSocket, SIGNAL(connected()),

17 this, SLOT(sendRequest()));

18 connect(&tcpSocket, SIGNAL(disconnected()),

19 this, SLOT(connectionClosedByServer()));

20 connect(&tcpSocket, SIGNAL(readyRead()),

21 this, SLOT(updateTableWidget()));

22 connect(&tcpSocket, SIGNAL(error(QAbstractSocket::SocketError)),

23 this, SLOT(error()));

24 }

Π’ конструкторС ΠΌΡ‹ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌ поля рСдактирования Π΄Π°Ρ‚Ρ‹ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π΄Π°Ρ‚ΠΎΠΉ ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ состояния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ соСдинСнии. Π’ Qt Designer свойства minimum ΠΈ maximum ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° состояния ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π»ΠΈΡΡŒ Π² 0. Π­Ρ‚ΠΎ опрСдСляСт ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ QProgressBar ΠΊΠ°ΠΊ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° занятости вмСсто стандартного ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°, ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚ выполнСния Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Π’ конструкторС ΠΌΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ связываСм сигналы connected(), disconnected(), readyRead() ΠΈ error(QAbstractSocket::SocketError) класса QTcpSocket с Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌΠΈ слотами.

01 void TripPlanner::connectToServer()

02 {

03 tcpSocket.connectToHost("tripserver.zugbahn.de", 6178);

04 tableWidget->setRowCount(0);

05 searchButton->setEnabled(false);

06 stopButton->setEnabled(true);

07 statusLabel->setText(tr("Connecting to server..."));

08 progressBar->show();

09 nextBlockSize = 0;

10 }

Π‘Π»ΠΎΡ‚ connectToServer() выполняСтся, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ‚ ΠΊΠ»Π°Π²ΠΈΡˆΡƒ Search для запуска ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ поиска. ΠœΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ connectToHost() ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Ρ‚ΠΈΠΏΠ° QTcpSocket для подсоСдинСния ΠΊ сСрвСру, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, доступСн Ρ‡Π΅Ρ€Π΅Π· ΠΏΠΎΡ€Ρ‚ 6178 ΠΏΠΎ Π²Ρ‹ΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΎΠΌΡƒ адрСсу хоста tripserver.zugbahn.de. (Если Π²Ρ‹ ΡΠΎΠ±ΠΈΡ€Π°Π΅Ρ‚Π΅ΡΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π½Π° вашСй машинС, Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ имя хоста Π½Π° QHostAddress::LocalHost.) Π’Ρ‹Π·ΠΎΠ² connectToHost() выполняСтся асинхронно; эта функция всСгда Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. Π‘ΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ устанавливаСтся ΠΏΠΎΠ·ΠΆΠ΅. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ QTcpSocket Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ сигнал connected(), Ссли соСдинСниС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ осущСствлСно ΠΈ дСйствуСт, ΠΈΠ»ΠΈ error(QAbstractSocket::SocketError), Ссли соСдинСниС Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ Π½Π΅ΡƒΠ΄Π°Ρ‡Π΅ΠΉ.

Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ обновляСм интСрфСйс ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π² частности Π΄Π΅Π»Π°Π΅ΠΌ Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ состояния прилоТСния.

НаконСц, ΠΌΡ‹ устанавливаСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ nextBlockSize Π½Π° 0. Π­Ρ‚Π° пСрСмСнная содСрТит Π΄Π»ΠΈΠ½Ρƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΡ‚ сСрвСра. ΠœΡ‹ Π·Π°Π΄Π°Π»ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π΅Ρ‰Π΅ Π½Π΅ Π·Π½Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±Π»ΠΎΠΊΠ°.

01 void TripPlanner::sendRequest()

02 {

03 QByteArray block;

04 QDataStream out(&block, 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(), увСдомляя ΠΎΠ± установкС соСдинСния. Π—Π°Π΄Π°Ρ‡Π° этого слота β€” ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ запрос ΠΊ сСрвСру с ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ΠΉ всСй Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.