- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
QT 4: программирование GUI на С++ - Жасмин Бланшет
Шрифт:
Интервал:
Закладка:
Тогда вызов qSort() будет таким:
QStringList list;
qSort(list.begin(), list.end(), insensitiveLessThan);
Алгоритм qStableSort() аналогичен qSort(), за исключением того, что он гарантирует сохранение порядка следования одинаковых элементов. Этот алгоритм стоит применять в тех случаях, когда критерий сортировки учитывает только часть значения элемента и пользователь видит результат сортировки. Мы использовали qStableSort() в главе 4 для реализации сортировки в приложении Электронная таблица.
Алгоритм qDeleteAll() вызывает оператор delete для каждого указателя, хранимого в контейнере. Он имеет смысл только для контейнеров, в качестве элементов которых используются указатели. После вызова этого алгоритма элементы по-прежнему присутствуют в контейнере, и для их удаления используется функция clear(). Например:
qDeleteAll(list);
list.clear();
Алгоритм qSwap() выполняет обмен значений двух переменных. Например:
int x1 = line.x1();
int x2 = line.x2();
if (x1 > x2)
qSwap(x1, x2);
Наконец, заголовочный файл <QtGlobal>, который включается в любой другой заголовочный файл Qt, содержит несколько полезных определений, в том числе функцию qAbs(), которая возвращает абсолютное значение аргумента, и функции qMin() и qMax(), которые возвращают максимальное или минимальное значение двух значений.
Строки, массивы байтов и объекты произвольного типа
QString, QByteArray и QVariant — три класса, которые имеют много общего с контейнерами и могут использоваться в некоторых контекстах как альтернатива контейнерам. Кроме того, как и контейнеры, эти классы используют неявное совмещение данных для уменьшения расхода памяти и повышения быстродействия.
Мы начнем с рассмотрения типа QString. Строковые данные применяются в любой программе с графическим пользовательским интерфейсом и не только непосредственно для пользовательского интерфейса, но часто и в качестве структур данных. В стандартном составе С++ содержится два типа строк: традиционные символьные массивы языка С с завершающим символом « » и класс std::string. Класс QString содержит 16-битовые значения в коде Unicode. Unicode содержит в качестве подмножеств коды ASCII и Latin-1 с их обычным числовым представлением. Но поскольку QString имеет 16-битовые значения, он может представлять тысячи других символов, используемых для записи букв большинства мировых языков. Дополнительную информацию по кодировке Unicode вы найдете в главе 17.
При использовании QString не стоит беспокоиться о таких не очень понятных вещах, как выделение достаточного объема памяти или гарантирование завершения данных символом ' '. Концептуально строки QString можно рассматривать как вектор символов QChar. Внутри QString могут быть символы ' '. Функция length() возвращает размер строки, включая символы ' '.
Класс QString содержит бинарный оператор +, обеспечивающий конкатенацию двух строк, и оператор += для добавления одной строки в конец другой. Поскольку QString заранее автоматически добавляет память в конец данных строки, построение строки путем повторения операций добавления символов в конец строки выполняется очень быстро. Ниже приводится пример обоих операторов:
QString str = "User: ";
str += userName + "n";
Существует также функция QString::append(), которая делает то же самое, что и оператор +=:
str = "User: ";
str.append(userName);
str.append("n");
Совершенно другой способ объединения строк заключается в использовании функции sprintf() класса QString:
str.sprintf("%s %.1f%%", "perfect competition", 100.0);
Данная функция поддерживает спецификаторы формата, используемые функцией библиотеки С++ sprintf(). В приведенном выше примере переменной str присваивается значение «perfect competition 100.0%» (абсолютно безупречное соревнование).
Имеется еще один способ составления строк из других строк или чисел, и он заключается в использовании функции arg():
str = QString("%1 %2 (%3s-%4s)")
.arg("реrmissive").arg("society").arg(1950).arg(1970);
В этом примере «%1» заменяется словом «permissive» (либеральное), «%2» заменяется словом «society» (общество), «%3» заменяется на «1950» и «%4» заменяется на «1970». В результате получаем «permissive society (1950s — 1970s)» (либеральное общество в 1950—70 годах). Функция arg() перегружается для обработки различных типов данных. В некоторых случаях используются дополнительные параметры для управления шириной поля, базой числа или точностью числа с плавающей точкой. В целом гораздо лучше использовать arg(), а не sprintf(), поскольку эта функция сохраняет тип, полностью поддерживает Unicode и позволяет трансляторам изменять порядок параметров «%1».
QString может преобразовывать числа в строки, используя статическую функцию QString::number():
str = QString::number(59.6);
Или это можно сделать при помощи функции setNum():
str.setNum(59.6);
Обратное преобразование строки в число осуществляется при помощи функций toInt(), toLongLong(), toDouble() и так далее. Например:
bool ok;
double d = str.toDouble(&ok);
Этим функциям передается необязательный параметр—ссылка на переменную типа bool, которая устанавливается на значение true или false в зависимости от успешности преобразования. Если преобразование завершается неудачей, эти функции возвращают 0.
Имея некоторую строку, нам часто приходится выделять какую-то ее часть. Функция mid() возвращает подстроку заданной длины (второй аргумент), начиная с указанной позиции (первый аргумент). Например, следующий программный код выводит на консоль слово «pays»[6]:
QString str = "polluter pays principle";
qDebug() << str.mid(9, 4);
Существуют также функции left() и right(), которые выполняют аналогичную работу. Обеим функциям передается количество символов n, и они возвращают первые и последние n символов строки. Например, следующий программный код выдает на консоль слова «polluter principle»:
QString str = "polluter pays principle";
qDebug() << str.left(8) << " " << str.right(9);
Если требуется определить, содержится ли в строке конкретный символ, подстрока или соответствует ли строка регулярному выражению, мы можем использовать один из вариантов функции indexOf() класса QString:
QString str = "the middle bit";
int i = str.indexOf("middle");
В результате i становится равным 4. Функция indexOf() возвращает -1 при неудачном поиске и принимает в качестве необязательных аргументов начальную позицию и флажок учета регистра.
Если мы просто хотим проверить начальные или конечные символы строки, мы можем использовать функции startsWith () и endsWith():
if (url.startsWith("http:") && url.endsWith(".png"))
Это проще и быстрее, чем:
if (url.left(5) == "http:" && url.right(4) == ".png")
Оператор сравнения строк == зависит от регистра. Если сравниваются строки, которые пользователь видит на экране, обычно правильным решением будет использование функции localeAwareCompare(), а если необходимо сделать сравнение не зависимым от регистра, мы можем использовать функции toUpper() или toLower(). Например:
if (fileName.toLower() == "readme.txt")
Если мы хотим заменить определенную часть строки другой подстрокой, мы можем использовать функцию replace():
QString str= "a cloudy day";
str.replace(2, 6, "sunny");
Результатом является «sunny day» (солнечный день). Этот программный код может быть переписан с применением функций remove() и insert():
str.remove(2, 6);
str.insert(2, "sunny");
Во-первых, мы удаляем шесть символов, начиная с позиции 2, и в результате получаем строку «а_ _day» (с двумя пробелами), затем мы вставляем слово «sunny» в позицию 2.
Существуют перегруженные версии функции replace(), которые заменяют все подстроки, совпадающие со значением первого аргумента, вторым аргументом. Например, ниже показано, как можно заменить все символы «&» в строке на «&»:
str.replace("&", "&");
Часто требуется удалять из строки пробельные символы (пробелы, символы табуляции и перехода на новую строку). QString имеет функцию, которая удаляет эти символы с обоих концов строки:
QString str = " ВОВ t THE nDOG n";
qDebug() << str.trimmed();
Строку str можно представить в виде

