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

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

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

int row = fields.takeFirst().toInt();

int column = fields.takeFirst().toInt();

setFormula(row, column, fields.join(' '));

}

}

ΠœΡ‹ считываСм ΠΎΠ΄Π½ΠΈΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ΄Π½Ρƒ строку Π΄Π°Π½Π½Ρ‹Ρ… прилоТСния ЭлСктронная Ρ‚Π°Π±Π»ΠΈΡ†Π°. Ѐункция readLine() удаляСт Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠΉ символ '\n'. Ѐункция QString::split() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список строк, разбивая строку Π½Π° части согласно ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌ символам—раздСлитСлям. НапримСр, ΠΏΡ€ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ строки Β«5 19 Total valueΒ» Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ список ΠΈΠ· Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ… элСмСнтов [Β«5Β», Β«19Β», Β«TotalΒ», Β«valueΒ»].

Π”Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½Ρ‹, Ссли имССтся ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Ρ‚Ρ€ΠΈ поля. Ѐункция QStringList::takeFirst() удаляСт ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт списка ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ элСмСнт. ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π΅Π΅ для извлСчСния Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² строк ΠΈ столбцов. ΠœΡ‹ Π½Π΅ Π΄Π΅Π»Π°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ошибок; Ссли считываСмый Π½ΠΎΠΌΠ΅Ρ€ строки ΠΈΠ»ΠΈ Π½ΠΎΠΌΠ΅Ρ€ столбца оказываСтся Π½Π΅ числом, функция QString::toInt() Π²ΠΎΠ·Π²Ρ€Π°Ρ‚ΠΈΡ‚ 0. Вызывая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ setFormula(), ΠΌΡ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌ ΠΎΡΡ‚Π°Π²ΡˆΠΈΠ΅ΡΡ поля Π² ΠΎΠ΄Π½Ρƒ строку.

Π’ нашСм Π²Ρ‚ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с QTextStream ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ посимвольно ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ тСкстовый Ρ„Π°ΠΉΠ» ΠΈ Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ этот ΠΆΠ΅ тСкст, удаляя ΠΈΠ· строки Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ ΠΈ замСняя символы табуляции ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ. Π’ΡΡŽ эту Ρ€Π°Π±ΠΎΡ‚Ρƒ Π΄Π΅Π»Π°Π΅Ρ‚ функция tidyFile():

01 void tidyFile(QIODevice *inDevice, QIODevice *outDevice)

02 {

03 QTextStream in(inDevice);

04 QTextStream out(outDevice);

05 const int TabSize = 8;

06 int endlCount = 0;

07 int spaceCount = 0;

08 int column = 0;

09 QChar ch;

10 while (!in.atEnd()) {

11 in >> ch;

12 if (ch == '\n') {

13 ++endlCount;

14 spaceCount = 0;

15 column = 0;

16 } else if (ch == '\t') {

17 int size = TabSize - (column % TabSize);

18 spaceCount += size;

19 column += size;

20 } else if (ch == ' ') {

21 ++spaceCount;

22 ++column;

23 } else {

24 while (endlCount > 0) {

25 out << endl;

26 --endlCount;

27 column = 0;

28 }

29 while (spaceCount > 0) {

30 out << ' ';

31 --spaceCount;

32 ++column;

33 }

34 out << ch;

35 ++column;

36 }

37 }

38 out << endl;

39 }

ΠœΡ‹ создаСм для Π²Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π° Π΄Π°Π½Π½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ QTextStream, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ Π½Π° Π±Π°Π·Π΅ устройств QIODevice, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… конструктору. ΠœΡ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌ Ρ‚Ρ€ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ для контроля состояния: счСтчик Π½ΠΎΠ²Ρ‹Ρ… строк, счСтчик ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ² ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ столбца Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ строкС (для прСобразования символов табуляции Π² ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ количСство ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²).

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

01 int main()

02 {

03 QFile inFile;

04 QFile outFile;

05 inFile.open(stdin, QFile::ReadOnly);

06 outFile.open(stdout, QFile::WriteOnly);

07 tidyFile(&inFile, &outFile);

08 return 0;

09 }

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π½Π΅ Π½ΡƒΠΆΠ΅Π½ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ QApplication, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ классы Qt. Бписок всСх ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… классов приводится Π½Π° Π²Π΅Π±-страницС http://doc.trolltech.com/4.1/tools.html. ΠœΡ‹ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

tidy < cool.cpp > cooler.cpp

Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ, позволяя Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ², ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌΠΈ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, Ссли ΠΎΠ½ΠΈ Π·Π°Π΄Π°Π½Ρ‹, Π° Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ для Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ° Π²Π²ΠΎΠ΄Π° cin Π² ΠΏΠΎΡ‚ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° cout.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ консольноС, Π΅Π³ΠΎ Ρ„Π°ΠΉΠ» .pro Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ отличаСтся ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π½Π°ΠΌΠΈ Π² прилоТСниях с графичСским интСрфСйсом:

TEMPLATE = app

QT = core

CONFIG += console

CONFIG -= app_bundle

SOURCES = tidy.cpp

ΠœΡ‹ собираСм ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с QtCore, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ здСсь Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ графичСского ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса. Π—Π°Ρ‚Π΅ΠΌ ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ Π² Windows ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ (bundle) ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ систСмы Mac OS X.

ΠŸΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΈ записи простых ASCIIβ€”Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ² с ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΊΠΎΠΉ ISO 8859-1 (Latin-1) ΠΌΠΎΠΆΠ½ΠΎ нСпосрСдствСнно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ интСрфСйс QIODevice вмСсто класса QTextStream. ΠŸΠΎΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊ ΠΈΠΌΠ΅Π΅Ρ‚ смысл Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ€Π΅Π΄ΠΊΠΈΡ… случаях, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ трСбуСтся Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²ΠΎΠΊ ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ QTextStream обСспСчиваСт Ρ‚Π°ΠΊΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ Π±Π΅Π·Π±ΠΎΠ»Π΅Π·Π½Π΅Π½Π½ΠΎ. Если Π²Ρ‹ всС-Ρ‚Π°ΠΊΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΈΡΠ°Ρ‚ΡŒ тСкст нСпосрСдствСнно Π½Π° устройство QIODevice, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Ρ„Π»Π°ΠΆΠΎΠΊ QIODevice::Text Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ open(), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

file.open(QIODevice::WriteOnly | QIODevice::Text);

Π­Ρ‚ΠΎΡ‚ Ρ„Π»Π°ΠΆΠΎΠΊ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ устройству QIODevice ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ записи Π² систСмС Windows Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ символы '\n' Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Β«\r\nΒ». ΠŸΡ€ΠΈ Ρ‡Ρ‚Π΅Π½ΠΈΠΈ ΠΎΠ½ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ устройству, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ символы '\r' ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ Π½Π° любой ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°ΡΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ½Π΅Ρ† ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строки обозначаСтся символом Π½ΠΎΠ²ΠΎΠΉ строки '\n' Π²Π½Π΅ зависимости ΠΎΡ‚ принятых Π½Π° этот счСт соглашСний Π² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмС.

Π Π°Π±ΠΎΡ‚Π° с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ

Класс QDir обСспСчиваСт нСзависимыС ΠΎΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ срСдства Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ„Π°ΠΉΠ»Π°Ρ…. Для дСмонстрации способов примСнСния класса QDir ΠΌΡ‹ напишСм нСбольшоС консольноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ подсчитываСт Ρ€Π°Π·ΠΌΠ΅Ρ€ дискового пространства, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠ³ΠΎ всСми изобраТСниями Π² ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π²ΠΎ всСх Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, Π²Π½Π΅ зависимости ΠΎΡ‚ Π³Π»ΡƒΠ±ΠΈΠ½Ρ‹ ΠΈΡ… располоТСния.

ΠžΡΠ½ΠΎΠ²Ρƒ прилоТСния составляСт функция imageSpace(), которая рСкурсивно подсчитываСт ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π² Π·Π°Π΄Π°Π½Π½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅:

01 qlonglong imageSpace(const QString &path)

02 {

03 qlonglong size = 0;

04 QDir dir(path);

05 QStringList filters;

06 foreach (QByteArray format, QImageReader::supportedImageFormats())

07 filters += "*." + format;

08 foreach (QString file, dir.entryList(filters, QDir::Files))

09 size += QFileInfo(dir, file).size();

10 foreach (QString subDir, dir.entryList(QDir::Dirs

11 | QDir::NoDotAndDotDot))

12 size += imageSpace(path + QDir::separator() + subDir);

13 return size;

14 }

ΠœΡ‹ Π½Π°Ρ‡Π½Π΅ΠΌ с создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° QDir для Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΈΠ»ΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΠΏΡƒΡ‚ΠΈ. ΠœΡ‹ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ entryList() Π΄Π²Π° Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ содСрТит список Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π΅Π»Π°ΠΌΠΈ. Π¨Π°Π±Π»ΠΎΠ½Ρ‹ этих Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ символы Β«*Β» ΠΈ Β«?Β». Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ примСняСм Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ QImage. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ Π·Π°Π΄Π°Π΅Ρ‚ Ρ‚ΠΈΠΏ Π½ΡƒΠΆΠ½Ρ‹Ρ… Π½Π°ΠΌ элСмСнтов (ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, дисководы ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅).

ΠœΡ‹ выполняСм Ρ†ΠΈΠΊΠ» ΠΏΠΎ списку Ρ„Π°ΠΉΠ»ΠΎΠ², подсчитывая ΠΈΡ… совокупный Ρ€Π°Π·ΠΌΠ΅Ρ€. Класс QFileInfo позволяСт Π½Π°ΠΌ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ доступ ΠΊ Ρ‚Π°ΠΊΠΈΠΌ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠ°ΠΊ ΠΈΡ… Ρ€Π°Π·ΠΌΠ΅Ρ€, ΠΏΡ€Π°Π²Π° доступа, Π²Π»Π°Π΄Π΅Π»Π΅Ρ† ΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π° создания, измСнСния ΠΈ послСднСго доступа.

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ entryList() ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ всС ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°. ΠœΡ‹ выполняСм Ρ†ΠΈΠΊΠ» ΠΏΠΎ Π½ΠΈΠΌ (ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ . ΠΈ ..) ΠΈ рСкурсивно Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ imageSpace() для получСния совокупного Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ.

Для образования ΠΏΡƒΡ‚ΠΈ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ ΠΌΡ‹ ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ подсоСдиняСм имя ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°, раздСляя ΠΈΡ… слСшСм. Класс QDir ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ символ Β«/Β» Π² качСствС раздСлитСля ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π½Π° всСх ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… ΠΈ распознаСт символ Β«\Β» Π² систСмС Windows. ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ ΠΏΡƒΡ‚ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ QDir::convertSeparators() для прСобразования слСшСй Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ main() Π² Π½Π°ΡˆΡƒ Π½Π΅Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

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

02 {

03 QCoreApplication app(argc, argv);

04 QStringList args = app.arguments();