Компания ALT Linux
Опубликован: 07.03.2015 | Доступ: свободный | Студентов: 2136 / 487 | Длительность: 24:14:00
Лекция 12:

Структура проекта. Основные типы

12.4 Работа с текстовыми строками в Qt. Класс QString. Списки строк QStringList.

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

В Qt для работы со строками есть мощный и специализированный классQString. Он имеет поддержку Unicode, возможность преобразования текста между разными кодировками и в обычные строки С и std::string. А также он имеет хорошее быстродействие и богатый набор инструментов для работы. Поддержка Unicode позволяет работать с текстом на любом языке мира, что очень важно при локализации графического интерфейса программы.

Рассмотрим методы работы с текстовыми строками в Qt. Перед началом работы с текстом в Qt нужно подключить файл описания QString:

#include <QString>

Как и почти для всех классов Qt, название класса совпадает с названием файла описания класса, который необходимо подключить с помощью директивы #include.

Существует большое количество разных способов добавления строк и символов к существующей строке:

QString lMainStr = " string "; // lMainStr == " string "
lMainStr += " "; // lMainStr == " string "
( lMainStr += " is " ) += " "; // lMainStr == " string is "
QString lHelperStr1 ( " composed " );
lMainStr += lHelperStr1; // lMainStr == " string is composed"
QString lHelperStr2 = + " " +QString( " from " ) + " ";
lMainStr.append ( lHelperStr2 );
// lMainStr == " string is composited from "
lMainStr.push_back ( " fragments " );
// lMainStr == " string is composited from fragments "
lMainStr.prepend ( " This " );
// lMainStr == "This string is composited from fragments "
lMainStr.insert ( lMainStr.length ( ), "." );
// lMainStr == "This string is composited from fragments."
lMainStr += QString( 2, '.' );
// lMainStr == "This string is composited from fragments..."
lMainStr= lMainStr.rightJustified ( lMainStr.length ( ) + 8, ' ' );
// lMainStr=="This string is composited from fragments..."

Также есть возможность выделения части строки либо разделения её на части:

QString lQuote= "This is sentence one. This is sentence two. ";
//Новая строка из пяти символов
QString lFragment1 = lQuote.left ( 5 ); // lFragment1 == "This "
qDebug ( ) << " lFragment1 is : " << lFragment1;
//Первое предложение: Все символы до первой точки
QString lSentence= lQuote.section ( ".", 0, 0 );
qDebug ( ) << " lSentenceis : " << lSentence;
// lsentence == "This is sentence one"
//Список слов в строке
QStringList lWordsList = lSentence.split ( " ", QString::SkipEmptyParts );
qDebug ( ) << lWordsList;
// lWordsList == (" This ", " is ", " sentence ", "one ", "This " ,
// " is ", " sentence ", " two ")

Для проверки на пустую строку используют метод isEmpty(). Его не следует путать с методом isNull(), который возвращает значение true только для ещё не инициализированной строки. Например:

QString( ).isNull ( ); // true (нулевая строка)
QString( ).isEmpty ( ); // true (нулевая строка тоже пустая)
QString( "" ).isNull ( ); // false (пустая строка не является нулевой)
QString( "" ).isEmpty ( ); // true
QString( "abc" ).isNull ( ); // false
QString( "abc" ).isEmpty ( ); // false

QString имеет инструменты для преобразования из std::string и наоборот. Например:

QString lQtstringInitial = " I am a standard STL string. ";
std::string lStdstring = lQtstringInitial.toStdString ( );
QString lQtString = QString::fromStdString ( lStdString );

Также QString имеет средства для работы с числовой информацией:

//преобразование целого числа в строку
int x = 16;
QString lXStr = QString::number ( x );
// x = 7; lXStr = 7
//преобразование строки в целое число
int y = lXStr.toInt ( );
//преобразование дробного числа в строку
double teta = 12099.10012021210102109991;
QString lTetaStr = QString::number ( teta );
// lTetaStr == 12099.1
lTetaStr.setNum ( teta );
// lTetaStr == 12099.1
//вывод с 4-мя знаками после запятой
lTetaStr = QString::number (teta, 'f', 4 );
// lTetaStr == 12099.1001
//форматирование с использованием символа "e"
lTetaStr = QString::number (teta, 'e' );
// lTetaStr == 1.209910e+04
//Запись числа в строку в разных системах счисления
lXStr = QString("int %1 is %L2 in decimal system, %L3 in binary system, and %
	L4 in hexadecimal")
		.arg( x )
		.arg( x, 0, 10 )
		.arg( x, 0, 2 )
		.arg( x, 0, 16 );

Для работы со списком строк в Qt предусмотрен специализированный тип QStringList. QStringList относят к контейнерным классам Qt. Подробнее классы-контейнеры мы рассмотрим в следующем параграфе.

Сергей Радыгин
Сергей Радыгин

Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке?

Тип приложения - не Qt,

Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.

 

Юрий Герко
Юрий Герко

Кому удалось собрать пример из раздела 13.2 Компоновка (Layouts)? Если создавать проект по изложенному алгоритму, автоматически не создается  файл mainwindow.cpp. Если создавать этот файл вручную и добавлять в проект, сборка не получается - компилятор сообщает об отсутствии класса MainWindow. Как правильно выполнить пример?