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

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

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

qRegisterMetaTypeStreamOperators<BusinessCard>("BusinessCard");

Π’ Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅ основноС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ ΡƒΠ΄Π΅Π»Π΅Π½ΠΎ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌ Qt, Π° Ρ‚Π°ΠΊΠΆΠ΅ классам QString, QByteArray ΠΈ QVariant. ΠšΡ€ΠΎΠΌΠ΅ этих классов Qt ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ². Один ΠΈΠ· Π½ΠΈΡ… β€” QPair<T1, T2>, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ просто Ρ…Ρ€Π°Π½ΠΈΡ‚ Π΄Π²Π° значСния ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π΅Π½ классу std::pair<T1, T2>. Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠΌ являСтся QBitArray, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»Π΅ Π³Π»Π°Π²Ρ‹ 19. НаконСц, имССтся ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ QVarLengthArray<T, Prealloc> β€” низкоуровнСвая Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Π²Π΅ΠΊΡ‚ΠΎΡ€Ρƒ QVector<T>. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π·Π°Ρ€Π°Π½Π΅Π΅ выдСляСт ΠΏΠ°ΠΌΡΡ‚ΡŒ Π² стСкС ΠΈ Π½Π΅ допускаСт нСявноС совмСстноС использованиС, Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Ρƒ Π½Π΅Π³ΠΎ мСньшС, Ρ‡Π΅ΠΌ Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° QVector<T>, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ подходящим Π² напряТСнных Ρ†ΠΈΠΊΠ»Π°Ρ….

Алгоритмы Qt, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ нСсколько Π½Π΅ рассмотрСнных здСсь, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ qCopyBackward() ΠΈ qEqual(), описаны Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Qt, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ адрСсу http://doc.trolltech.com/4.1/algorithms.html. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠ΅ описаниС ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΎΠ² Qt, Π² Ρ‚ΠΎΠΌ числС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± ΠΈΡ… Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΈ ΠΎΠ±ΡŠΠ΅ΠΌΠ½Ρ‹Ρ… характСристиках, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° страницС http://doc.trolltech.com/4.1/containers.html.

Π“Π»Π°Π²Π° 12. Π’Π²ΠΎΠ΄β€”Π²Ρ‹Π²ΠΎΠ΄

ΠŸΠΎΡ‡Ρ‚ΠΈ Π² ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ приходится Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Π²ΠΎΠ΄Π°β€”Π²Ρ‹Π²ΠΎΠ΄Π°. Qt обСспСчиваСт Π²Π΅Π»ΠΈΠΊΠΎΠ»Π΅ΠΏΠ½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π²Π²ΠΎΠ΄Π°β€”Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ QIODevice β€” ΠΌΠΎΡ‰Π½ΠΎΠΉ абстракции «устройств», способных Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊΠΈ Π±Π°ΠΉΡ‚ΠΎΠ². Qt содСрТит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ подклассы QIODevice:

β€’ QFile β€” ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ, находящимся Π² локальной Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС ΠΈΠ»ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½Π½Ρ‹ΠΌ Π² исполняСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ,

β€’ QTemporaryFile β€” создаСт Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² локальной Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ доступ ΠΊ Π½ΠΈΠΌ,

β€’ QBuffer β€” считываСт ΠΈΠ»ΠΈ записываСт Π΄Π°Π½Π½Ρ‹Π΅ Π² QByteArray,

β€’ QProcess β€” запускаСт внСшниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ обСспСчиваСт связь ΠΌΠ΅ΠΆΠ΄Ρƒ процСссами,

β€’ QTcpSocket β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ сСти, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» TCP,

β€’ QUdpSocket β€” ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ ΠΈ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΈΠ· сСти Π΄Π΅ΠΉΡ‚Π°Π³Ρ€Π°ΠΌΠΌΡ‹ UDP.

QProcess, QTcpSocket ΠΈ QUdpSocket ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ устройствами, Ρ‚.Π΅. ΠΎΠ½ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, начиная с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°ΡΡΡŒ ΠΊ послСднСму Π±Π°ΠΉΡ‚Ρƒ. QFile, QTemporaryFile ΠΈ QBuffer ΡΠ²Π»ΡΡŽΡ‚ΡΡ устройствами ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ доступа ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚Ρ‹ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ ΠΈΠ· любой ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ; ΠΎΠ½ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QIODevice::seek() для измСнСния полоТСния указатСля Ρ„Π°ΠΉΠ»Π°.

ΠšΡ€ΠΎΠΌΠ΅ этих устройств Qt прСдоставляСт Π΄Π²Π° класса высокоуровнСвых ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для чтСния ΠΈ записи Π½Π° любоС устройство Π²Π²ΠΎΠ΄Π°β€”Π²Ρ‹Π²ΠΎΠ΄Π°: QDataStream для Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ QTextStream для тСкста. Π­Ρ‚ΠΈ классы ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠ΅ аспСкты, ΠΊΠ°ΠΊ порядок Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈ ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠ° тСкста, позволяя Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΈ Π² Ρ€Π°Π·Π½Ρ‹Ρ… странах прилоТСниям Qt ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ классы Qt ΠΏΠΎ Π²Π²ΠΎΠ΄Ρƒβ€”Π²Ρ‹Π²ΠΎΠ΄Ρƒ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌΠΈ, Ρ‡Π΅ΠΌ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ классы стандартного Π‘++, ΠΏΡ€ΠΈ использовании ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ приходится ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠΌΡƒ программисту.

QFile позволяСт Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ доступ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»Π°ΠΌ, нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Ρ€Π°ΡΠΏΠΎΠ»Π°Π³Π°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС ΠΈΠ»ΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π²Π½Π΅Π΄Ρ€Π΅Π½Π½Ρ‹ΠΌΠΈ Π² исполняСмый ΠΌΠΎΠ΄ΡƒΠ»ΡŒ прилоТСния ΠΊΠ°ΠΊ рСсурсы. Для ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ приходится Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Ρ†Π΅Π»Ρ‹ΠΌΠΈ Π½Π°Π±ΠΎΡ€Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², Π² Qt прСдусмотрСны классы QDir ΠΈ QFileInfo, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ свСдСния ΠΎ Ρ„Π°ΠΉΠ»Π°Ρ…, располоТСнных Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ².

Класс QProcess позволяСт Π½Π°ΠΌ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ внСшниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ связь с Π½ΠΈΠΌΠΈ Ρ‡Π΅Ρ€Π΅Π· стандартныС ΠΊΠ°Π½Π°Π»Ρ‹ Π²Π²ΠΎΠ΄Π°, Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ ошибок (cin, cout ΠΈ cerr). ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ срСды ΠΈ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ внСшним ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ связь с процСссом осущСствляСтся Π² асинхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅ (Π±Π΅Π· Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΎΠΊ), Π½ΠΎ всС ΠΆΠ΅ остаСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠΉ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Π Π°Π±ΠΎΡ‚Π° с ΡΠ΅Ρ‚ΡŒΡŽ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² XML Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π°ΠΆΠ½Ρ‹Π΅ Ρ‚Π΅ΠΌΡ‹, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ рассмотрСны ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ Π² Π³Π»Π°Π²Π°Ρ… 14 ΠΈ 15, ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΈΠΌ посвящСнным.

Π§Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…

Π‘Π°ΠΌΡ‹ΠΉ простой способ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ сохранСния Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… Π² Qt β€” ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ экзСмпляр класса QFile, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ» ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊ Π½Π΅ΠΌΡƒ доступ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QDataStream. QDataStream обСспСчиваСт нСзависимый ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ памяти, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°ΠΊΠΈΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π‘++, ΠΊΠ°ΠΊ int ΠΈ double, ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Qt, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ QByteArray, QFont, QImage, QPixmap, QString ΠΈ QVariant, Π° Ρ‚Π°ΠΊΠΆΠ΅ классы—контСйнСры Qt, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ QList<T> ΠΈ QMap<K, T>.

НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ†Π΅Π»Ρ‹ΠΉ Ρ‚ΠΈΠΏ QImage ΠΈ QMap<QString, QColor> Π² Ρ„Π°ΠΉΠ»Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ facts.dat:

QImage image("philip.png");

QMap<QString, QColor> map;

map.insert("red", Qt::red);

map.insert("green", Qt::green);

map.insert("blue", Qt::blue);

QFile file("facts.dat");

if (!file.open(QIODevice::WriteOnly)) {

cerr << "Cannot open file for writing: "

<< qPrintable(file.errorString()) << endl;

return;

}

QDataStream out(&file);

out.setVersion(QDataStream::Qt_4_1);

out << quint32(0x12345678) << image << map;

Если Π½Π΅ удаСтся ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Ρ„Π°ΠΉΠ», ΠΌΡ‹ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌ ΠΎΠ± этом ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅. ΠœΠ°ΠΊΡ€ΠΎΡ qPrintable() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ const char *, принимая QString. (МоТно Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ ΠΏΠΎ-Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QString::toStdString(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ Ρ‚ΠΈΠΏ std::string, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² <iostream> прСдусмотрСна ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° <<.)

ΠŸΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° ΠΌΡ‹ создаСм QDataStream ΠΈ опрСдСляСм Π΅Π³ΠΎ Π½ΠΎΠΌΠ΅Ρ€ вСрсии. НомСр вСрсии β€” это Ρ†Π΅Π»ΠΎΠ΅ число, Π²Π»ΠΈΡΡŽΡ‰Π΅Π΅ Π½Π° прСдставлСниС Π² Qt Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… (Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ Π΄Π°Π½Π½Ρ‹Ρ… Π‘++ всСгда ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ). Π’ Qt 4.1 Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ слоТных Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ² ΠΈΠΌΠ΅ΡŽΡ‚ Π²Π΅Ρ€ΡΠΈΡŽ 7. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»ΠΈΠ±ΠΎ ТСстко Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ константу 7, Π»ΠΈΠ±ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ символичСскоС имя QDataStream::Qt_4_1.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ прСдставлСниС значСния 0x12345678 Π² Π²ΠΈΠ΄Π΅ 32-Π±ΠΈΡ‚ΠΎΠ²ΠΎΠ³ΠΎ Ρ†Π΅Π»ΠΎΠ³ΠΎ числа Π±Π΅Π· Π·Π½Π°ΠΊΠ° Π½Π° всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ…, ΠΌΡ‹ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Ρ‚ΠΈΠΏ ΠΊ quint32 β€” Ρ‚ΠΈΠΏΡƒ Π΄Π°Π½Π½Ρ‹Ρ…, Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ всСгда Ρ€Π°Π²Π΅Π½ Ρ‚ΠΎΡ‡Π½ΠΎ 32 Π±ΠΈΡ‚Π°ΠΌ. Для обСспСчСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ совмСстимости QDataStream ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ прямой порядок Π±Π°ΠΉΡ‚ΠΎΠ² (big-endian); это ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ, вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setByteOrder().

Нам Π½Π΅ Π½Π°Π΄ΠΎ явно Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ», ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это дСлаСтся автоматичСски, ΠΊΠΎΠ³Π΄Π° пСрСмСнная Ρ‚ΠΈΠΏΠ° QFile Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ записаны, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ flush() ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (true ΠΏΡ€ΠΈ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ).

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для чтСния Π΄Π°Π½Π½Ρ‹Ρ… являСтся Π·Π΅Ρ€ΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ для записи Π΄Π°Π½Π½Ρ‹Ρ…:

quint32 n;

QImage image;

QMap<QString, QColor> map;

QFile file("facts.dat");

if (!file.open(QIODevice::ReadOnly)) {

cerr << "Cannot open file for reading: "

<< qPrintable(file.errorString()) << endl;

return;

}

QDataStream in(&file);

in.setVersion(QDataStream::Qt_4_1);

in >> n >> image >> map;

ΠŸΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π° ΠΆΠ΅ самая вСрсия QDataStream, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ использовали ΠΏΡ€ΠΈ записи. Π­Ρ‚ΠΎ условиС Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ всСгда. ЖСстко кодируя Π½ΠΎΠΌΠ΅Ρ€ вСрсии, ΠΌΡ‹ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ запись Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ (ΠΏΡ€ΠΈ условии компиляции прилоТСния с вСрсиСй Qt 4.1 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ вСрсиСй Qt).

QDataStream Ρ‚Π°ΠΊ Ρ…Ρ€Π°Π½ΠΈΡ‚ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ смоТСм ΠΈΡ… ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π±Π΅Π· особых усилий. НапримСр, QByteArray прСдставляСтся Π² Π²ΠΈΠ΄Π΅ структуры с 32-Π±ΠΈΡ‚ΠΎΠ²Ρ‹ΠΌ счСтчиком Π±Π°ΠΉΡ‚ΠΎΠ², Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΈΠ΄ΡƒΡ‚ сами Π±Π°ΠΉΡ‚Ρ‹. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ readRawBytes() ΠΈ writeRawBytes(), QDataStream ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для чтСния ΠΈ записи Π½Π΅Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π±Π°ΠΉΡ‚ΠΎΠ², Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Π² Π²ΠΈΠ΄Π΅ счСтчика Π±Π°ΠΉΡ‚ΠΎΠ².

ΠžΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ошибки ΠΏΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΏΠΎΡ‚ΠΎΠΊΠ° QDataStream достаточно просто. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ status(), Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ значСния QDataStream::Ok, QDataStream::ReadPastEnd ΠΈΠ»ΠΈ QDataStream::ReadCorruptData. ΠŸΡ€ΠΈ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠΈ ошибки ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ >> всСгда считываСт Π½ΡƒΠ»Π΅Π²Ρ‹Π΅ ΠΈΠ»ΠΈ пустыС значСния. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ΠΌΠΎΠΆΠ½ΠΎ просто ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ, Π½Π΅ бСспокоясь ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ ΡƒΠ΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒΡΡ Π² ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ чтСния, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠ² ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ status() Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

QDataStream Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π‘++ ΠΈ Qt; ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΈΡ… список доступСн Π² сСти Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ ΠΏΠΎ адрСсу http://doc.trolltech.com/4.1/datastreamformat.html. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ своих собствСнных ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ², пСрСгруТая ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ << ΠΈ >>. НиТС приводится ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использовано совмСстно с QDataStream: