Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

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

Шрифт:

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 для расчета размера пространства, занимаемого изображениями.

Класс QDir содержит и другие функции для работы с файлами и каталогами, включая entryInfoList (которая возвращает список объектов QFileInfo), rename, exists, mkdir и rmdir. Класс QFile содержит несколько удобных статических функций, в том числе remove и exists.

Ресурсы, внедренные в исполняемый модуль

До сих пор в этой главе мы говорили о доступе к данным, которые находятся на внешних устройствах, но в Qt можно также внедрять двоичные данные или текст в исполняемый модуль приложения. Это обеспечивается ресурсной системой Qt. В других главах мы использовали файлы ресурсов для внедрения файлов изображений в исполняемый модуль, однако внедрять можно любой файл. Читать внедренные файлы можно с использованием QFile, как будто это обычные файлы, расположенные в файловой системе.

Ресурсы преобразуются в программный код С++ ресурсным компилятором Qt (rcc). Мы можем указать qmake, что необходимо включить специальные правила для выполнения rcc, добавляя следующую строку в файл .pro:

RESOURCES = myresourcefile.qrc

Файл myresourcefile.qrc это XML—файл, который содержит список файлов, внедренных в исполняемый модуль.

Допустим, создается приложение, которое сохраняет подробную контактную информацию. Ради удобства пользователей мы хотим внедрить международные телефонные коды в исполняемый модуль. Если файл находится в подкаталоге datafiles каталога сборки приложения, файл ресурсов может выглядеть следующим образом:

<!DOCTYPE RCC><RCC version="1.0">

<qresource>

<file>datafiles/phone-codes.dat</file>

</qresource>

</RCC>

В приложении ресурсы опознаются по префиксу пути :/. В этом примере файл телефонных кодов имеет путь :/datafiles/phone-codes.dat и может быть считан как любой другой файл, используя QFile.

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

Второгодка. Книга 4. Подавать холодным

Ромов Дмитрий
4. Второгодка
Фантастика:
героическая фантастика
альтернативная история
сказочная фантастика
5.00
рейтинг книги
Второгодка. Книга 4. Подавать холодным

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Я все еще барон

Дрейк Сириус
4. Дорогой барон!
Фантастика:
боевая фантастика
5.00
рейтинг книги
Я все еще барон

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

Звездная Кровь. Экзарх II

Рокотов Алексей
2. Экзарх
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Звездная Кровь. Экзарх II

Возлюби болезнь свою

Синельников Валерий Владимирович
Научно-образовательная:
психология
7.71
рейтинг книги
Возлюби болезнь свою

Креститель

Прозоров Александр Дмитриевич
6. Ведун
Фантастика:
фэнтези
8.60
рейтинг книги
Креститель

Неучтенный элемент. Том 4

NikL
4. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 4

Второгодка. Книга 5. Презренный металл

Ромов Дмитрий
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл

На границе империй. Том 10. Часть 2

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 2

На границе империй. Том 6

INDIGO
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
На границе империй. Том 6

Лекарь Империи 2

Карелин Сергей Витальевич
2. Лекарь Империи
Фантастика:
городское фэнтези
аниме
дорама
фэнтези
попаданцы
5.00
рейтинг книги
Лекарь Империи 2

Источник

Билик Дмитрий Александрович
11. Бедовый
Фантастика:
юмористическое фэнтези
городское фэнтези
мистика
7.00
рейтинг книги
Источник

Кодекс Крови. Книга VII

Борзых М.
7. РОС: Кодекс Крови
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VII