Вход/Регистрация
QT 4: программирование GUI на С++
вернуться

Саммерфилд Марк

Шрифт:

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;

05 QString path = QDir::currentPath;

06 if (args.count > 1)

07 path = args[1];

08 cout << "Space used by images in " << qPrintable(path)

09 << " and its subdirectories is "

10 << (imageSpace(path) / 1024) << " KB" << endl;

11 return 0;

12 }

Мы используем функцию QDir::currentPath для получения пути текущего каталога. Мы могли бы поступить по-другому и использовать функцию QDir::homePath для получения домашнего каталога пользователя. Если пользователь указал путь в командной строке, мы используем именно его. Наконец, мы вызываем нашу функцию imageSpace для расчета размера пространства, занимаемого изображениями.

  • Читать дальше
  • 1
  • ...
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: