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

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

Жанры

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

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

Шрифт:

int x1 = line.x1;

int x2 = line.x2;

if (x1 > x2)

qSwap(x1, x2);

Наконец, заголовочный файл <QtGlobal>, который включается в любой другой заголовочный файл Qt, содержит несколько полезных определений, в том числе функцию qAbs, которая возвращает абсолютное значение аргумента, и функции qMin и qMax, которые возвращают максимальное или минимальное значение двух значений.

Строки, массивы байтов и объекты произвольного типа

QString, QByteArray и QVariant

три класса, которые имеют много общего с контейнерами и могут использоваться в некоторых контекстах как альтернатива контейнерам. Кроме того, как и контейнеры, эти классы используют неявное совмещение данных для уменьшения расхода памяти и повышения быстродействия.

Мы начнем с рассмотрения типа QString. Строковые данные применяются в любой программе с графическим пользовательским интерфейсом и не только непосредственно для пользовательского интерфейса, но часто и в качестве структур данных. В стандартном составе С++ содержится два типа строк: традиционные символьные массивы языка С с завершающим символом «\0» и класс std::string. Класс QString содержит 16-битовые значения в коде Unicode. Unicode содержит в качестве подмножеств коды ASCII и Latin-1 с их обычным числовым представлением. Но поскольку QString имеет 16-битовые значения, он может представлять тысячи других символов, используемых для записи букв большинства мировых языков. Дополнительную информацию по кодировке Unicode вы найдете в главе 17 .

При использовании QString не стоит беспокоиться о таких не очень понятных вещах, как выделение достаточного объема памяти или гарантирование завершения данных символом '\0'. Концептуально строки QString можно рассматривать как вектор символов QChar. Внутри QString могут быть символы '\0'. Функция length возвращает размер строки, включая символы '\0'.

Класс 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] :

6

Используемый здесь удобный синтаксис qDebug << arg требует включения заголовочного файла <QtDebug>, в то время как синтаксис qDebug("...", arg) доступен в любом файле, который включает по крайней мере один заголовочный файл Qt.

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 при неудачном поиске и принимает в качестве необязательных аргументов начальную позицию и флажок учета регистра.

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

Ермак. Противостояние. Книга одиннадцатая

Валериев Игорь
11. Ермак
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Ермак. Противостояние. Книга одиннадцатая

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

INDIGO
23. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 5

Креститель

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

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

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

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

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

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

INDIGO
11. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 7. Часть 5

Лед тронулся, тренер! Но что делать со стояком? Том 2

Некрасов Игорь
2. Ледовая Корона
Любовные романы:
эро литература
5.00
рейтинг книги
Лед тронулся, тренер! Но что делать со стояком? Том 2

Я все еще не князь. Книга XV

Дрейк Сириус
15. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще не князь. Книга XV

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

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

Разбуди меня

Рам Янка
7. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
остросюжетные любовные романы
5.00
рейтинг книги
Разбуди меня

Чужак из ниоткуда

Евтушенко Алексей Анатольевич
1. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Чужак из ниоткуда

Бастард Императора

Орлов Андрей Юрьевич
1. Бастард Императора
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Бастард Императора

Первый среди равных

Бор Жорж
1. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных

Имперец. Том 1 и Том 2

Романов Михаил Яковлевич
1. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 1 и Том 2