- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания QT 4 программирование GUI на С++ Жасмин Бланшет
Шрифт:
Интервал:
Закладка:
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' в последовательность «rn». При чтении он говорит устройству, что необходимо игнорировать символы '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();