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