|
Символы кириллицы выводит некорректно. Как сделать чтобы выводился читабельный текст на русском языке? Тип приложения - не Qt, Qt Creator 4.5.0 основан на Qt 5.10.0. Win7.
|
Структура проекта. Основные типы
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. Подробнее классы-контейнеры мы рассмотрим в следующем параграфе.