Qt/FAQ/QtCore
Материал из Wiki.crossplatform.ru
Root (Обсуждение | вклад) (→Строки) |
512es (Обсуждение | вклад) м (→Другой вариант рекурсивного поиска файлов) |
||
| (10 промежуточных версий не показаны.) | |||
| Строка 3: | Строка 3: | ||
За обработку строк в Qt отвечает класс QString, который хранит строки в Unicode в виде последовательностей 16-битовых символов QChar. Строки QString можно рассматривать как вектор символов QChar. При использовании QString не стоит беспокоится о таких вещах, как выделение достаточного объёма памяти или гарантирование завершения данных символом '\0'. Внутри QString могут быть символы '\0', функция length() вернет размер строки, включаю символы '\0'. | За обработку строк в Qt отвечает класс QString, который хранит строки в Unicode в виде последовательностей 16-битовых символов QChar. Строки QString можно рассматривать как вектор символов QChar. При использовании QString не стоит беспокоится о таких вещах, как выделение достаточного объёма памяти или гарантирование завершения данных символом '\0'. Внутри QString могут быть символы '\0', функция length() вернет размер строки, включаю символы '\0'. | ||
| - | |||
| - | |||
=== Манипуляции со строками === | === Манипуляции со строками === | ||
| + | Класс QString содержит operator+, который обеспечивает конкатенацию двух строк и operator+= для добавления одной строки в конец другой: | ||
| + | <source lang="cpp"> | ||
| + | QString sz, sz1="cross", sz2="platform"; | ||
| + | sz = sz1 + sz2; // sz == "crossplatform" | ||
| + | sz += ".ru"; // sz == "crossplatform.ru" | ||
| + | </source> | ||
| + | Также есть функция append, которая аналогична operator+=: | ||
| + | <source lang="cpp"> | ||
| + | QString sz; | ||
| + | sz.append( "crossplatform"); | ||
| + | sz.append( ".ru"); | ||
| + | // sz == "crossplatform.ru" | ||
| + | </source> | ||
| + | Если функция append добавляет одну строку в конец другой, то функция prepend добавляет одну строку в начало другой: | ||
| + | <source lang="cpp"> | ||
| + | sz.prepend( "http://"); | ||
| + | // sz == "http://crossplatform.ru" | ||
| + | </source> | ||
| + | Также можно добавить нужную нам строку в любую позицию другой строки: | ||
| + | <source lang="cpp"> | ||
| + | sz.insert( 7, QString("wiki.")); | ||
| + | // sz == "http://wiki.crossplatform.ru" | ||
| + | </source> | ||
| + | Для совместимости с STL в классе QString введены функции push_back и push_front, которые аналогичны функциям append и prepend, соответственно: | ||
| + | <source lang="cpp"> | ||
| + | QString sz = "crossplatform"; | ||
| + | sz.push_back( ".ru"); | ||
| + | // sz == "crossplatform.ru" | ||
| + | sz.push_front( "http://"); | ||
| + | // sz == "http://crossplatform.ru" | ||
| + | </source> | ||
| + | Если нужно удалить часть строки, то для этого есть функция remove: | ||
| + | <source lang="cpp"> | ||
| + | QString sz = "http://wiki.crossplatform.ru"; | ||
| + | sz.remove(7, 5); | ||
| + | // sz == "http://crossplatform.ru" | ||
| + | </source> | ||
| + | или это же можно сделать так: | ||
| + | <source lang="cpp"> | ||
| + | QString sz = "http://wiki.crossplatform.ru"; | ||
| + | sz.remove( "wiki."); | ||
| + | // sz == "http://crossplatform.ru" | ||
| + | </source> | ||
| + | |||
| + | <!-- | ||
| + | replace | ||
| + | sprintf | ||
| + | arg | ||
| + | split | ||
| + | compare | ||
| + | reserve | ||
| + | resize | ||
| + | --> | ||
| + | |||
| + | === Кодировка === | ||
| + | Есть строка в кодировке Windows-1251, и хотим превратить её в Unicode. Вот как это можно сделать: | ||
| + | <source lang="cpp-qt"> | ||
| + | QByteArray baString = "Тестовая строка"; | ||
| + | QString szString; | ||
| + | // Создаём кодек для кодировки Windows-1251 | ||
| + | QTextCodec pCodec = QTextCodec::codecForName("Windows-1251"); | ||
| + | // Преобразуем из Windows-1251 в Unicode | ||
| + | szString = pCodec->toUnicode( baString); | ||
| + | </source> | ||
| + | Преобразование строки из Unicode в Windows-1251: | ||
| + | <source lang="cpp-qt"> | ||
| + | baString = codec->fromUnicode( szString); | ||
| + | </source> | ||
| + | |||
| + | <!-- | ||
| + | // Устанавливаем кодировку для Locale | ||
| + | QTextCodec::setCodecForLocale( pCodec); | ||
| + | // Устанавливаем кодировку для "tr" | ||
| + | QTextCodec::setCodecForTr( pCodec); | ||
| + | // Устанавливаем кодировку для строк для строк | ||
| + | QTextCodec::setCodecForCStrings( pCodec); | ||
| + | --> | ||
== Массивы == | == Массивы == | ||
== Контейнеры == | == Контейнеры == | ||
== Дата и время == | == Дата и время == | ||
| + | [[Qt:Документация_4.3.2/time | Классы работы с датой]] можно разделить на две группы: | ||
| + | # [[QDateTime]], [[QDate]], [[QTime]] - классы предоставляющие функции для работы с датой и временем. | ||
| + | # [[QBasicTimer]], [[QTimer]] - классы для работы с таймерами. | ||
| + | |||
== Регулярные выражения == | == Регулярные выражения == | ||
== События == | == События == | ||
| Строка 15: | Строка 94: | ||
== Работа с плагинами == | == Работа с плагинами == | ||
== Работа с файлами и директориями == | == Работа с файлами и директориями == | ||
| + | ===Рекурсивный поиск файлов и папок=== | ||
| + | <source lang="cpp-qt">// Сама рекурсивная функция для поиска файлов и папок | ||
| + | bool FindFileAndDir( QString szDir) | ||
| + | { | ||
| + | qint16 qnFileCount = 0; | ||
| + | QDir dir( szDir); | ||
| + | foreach( QFileInfo fi, dir.entryInfoList()) | ||
| + | { | ||
| + | QString szFileName = fi.absoluteFilePath(); | ||
| + | if( fi.isDir()) | ||
| + | { | ||
| + | if( fi.fileName()=="." || fi.fileName()=="..") | ||
| + | continue; | ||
| + | |||
| + | FindFileAndDir( szFileName); | ||
| + | } | ||
| + | if( fi.isFile()) | ||
| + | { | ||
| + | qnFileCount++; | ||
| + | } | ||
| + | } | ||
| + | qDebug( "Dir: %s, File count: %d", qPrintable( szDir), qnFileCount); | ||
| + | |||
| + | return true; | ||
| + | } | ||
| + | |||
| + | int main(int argc, char *argv[]) | ||
| + | { | ||
| + | QString szDir="c:\\windows\\system32\\drivers"; | ||
| + | FindFileAndDir( szDir); | ||
| + | |||
| + | return 0; | ||
| + | }</source> | ||
| + | |||
| + | |||
| + | ===Другой вариант рекурсивного поиска файлов=== | ||
| + | <source lang="cpp-qt"> | ||
| + | QStringList fileFind(QString dirname) | ||
| + | { | ||
| + | QStringList files; | ||
| + | foreach (QString dir, QDir(dirname).entryList(QStringList(),QDir::Dirs | QDir::NoDotAndDotDot)) | ||
| + | files.append(fileFind(QDir(dirname).filePath(dir))); | ||
| + | foreach (QString file, QDir(dirname).entryList(QStringList(),QDir::Files | QDir::NoDotAndDotDot)) | ||
| + | files << QDir(dirname).filePath(file); | ||
| + | return files; | ||
| + | } | ||
| + | </source> | ||
| + | |||
| + | === Удаление директории с поддиректориями и файлами === | ||
| + | <source lang="cpp-qt">// | ||
| + | void DeleteAllFiles(const QString &path) | ||
| + | { | ||
| + | QDir oDir(path); | ||
| + | QStringList files = oDir.entryList(QDir::Files); | ||
| + | |||
| + | QStringList::Iterator itFile = files.begin(); | ||
| + | while (itFile != files.end()) | ||
| + | { | ||
| + | QFile oFile(path + "/" + *itFile); | ||
| + | oFile.remove(); | ||
| + | ++itFile; | ||
| + | } | ||
| + | |||
| + | QStringList dirs = oDir.entryList(QDir::Dirs); | ||
| + | QStringList::Iterator itDir = dirs.begin(); | ||
| + | while (itDir != dirs.end()) | ||
| + | { | ||
| + | if (*itDir != "." && *itDir != "..") DeleteAllFiles(path + "/" + *itDir); | ||
| + | ++itDir; | ||
| + | } | ||
| + | |||
| + | oDir.rmdir(path); | ||
| + | } | ||
| + | |||
| + | int main(int argc, char *argv[]) | ||
| + | { | ||
| + | QString path="c:\\windows\\system32"; // перед запуском измените путь, а то как бы чего не вышло! :) | ||
| + | DeleteAllFiles( path); | ||
| + | |||
| + | return 0; | ||
| + | }</source> | ||
| + | |||
| + | == См. также == | ||
| + | * [[Установка Qt4.3.x]] | ||
| + | * [[Развертывание приложений Qt в MS Windows]] | ||
| + | |||
| + | |||
| + | [[Категория:Qt FAQ]] | ||
Текущая версия на 01:39, 24 марта 2011
Содержание |
[править] QtCore - ядро не-GUI классов, используемое другими модулями
[править] Строки
За обработку строк в Qt отвечает класс QString, который хранит строки в Unicode в виде последовательностей 16-битовых символов QChar. Строки QString можно рассматривать как вектор символов QChar. При использовании QString не стоит беспокоится о таких вещах, как выделение достаточного объёма памяти или гарантирование завершения данных символом '\0'. Внутри QString могут быть символы '\0', функция length() вернет размер строки, включаю символы '\0'.
[править] Манипуляции со строками
Класс QString содержит operator+, который обеспечивает конкатенацию двух строк и operator+= для добавления одной строки в конец другой:
QString sz, sz1="cross", sz2="platform"; sz = sz1 + sz2; // sz == "crossplatform" sz += ".ru"; // sz == "crossplatform.ru"
Также есть функция append, которая аналогична operator+=:
QString sz; sz.append( "crossplatform"); sz.append( ".ru"); // sz == "crossplatform.ru"
Если функция append добавляет одну строку в конец другой, то функция prepend добавляет одну строку в начало другой:
sz.prepend( "http://"); // sz == "http://crossplatform.ru"
Также можно добавить нужную нам строку в любую позицию другой строки:
sz.insert( 7, QString("wiki.")); // sz == "http://wiki.crossplatform.ru"
Для совместимости с STL в классе QString введены функции push_back и push_front, которые аналогичны функциям append и prepend, соответственно:
QString sz = "crossplatform"; sz.push_back( ".ru"); // sz == "crossplatform.ru" sz.push_front( "http://"); // sz == "http://crossplatform.ru"
Если нужно удалить часть строки, то для этого есть функция remove:
QString sz = "http://wiki.crossplatform.ru"; sz.remove(7, 5); // sz == "http://crossplatform.ru"
или это же можно сделать так:
QString sz = "http://wiki.crossplatform.ru"; sz.remove( "wiki."); // sz == "http://crossplatform.ru"
[править] Кодировка
Есть строка в кодировке Windows-1251, и хотим превратить её в Unicode. Вот как это можно сделать:
QByteArray baString = "Тестовая строка"; QString szString; // Создаём кодек для кодировки Windows-1251 QTextCodec pCodec = QTextCodec::codecForName("Windows-1251"); // Преобразуем из Windows-1251 в Unicode szString = pCodec->toUnicode( baString);
Преобразование строки из Unicode в Windows-1251:
baString = codec->fromUnicode( szString);
[править] Массивы
[править] Контейнеры
[править] Дата и время
Классы работы с датой можно разделить на две группы:
- QDateTime, QDate, QTime - классы предоставляющие функции для работы с датой и временем.
- QBasicTimer, QTimer - классы для работы с таймерами.
[править] Регулярные выражения
[править] События
[править] Процессы и синхронизация
[править] Работа с плагинами
[править] Работа с файлами и директориями
[править] Рекурсивный поиск файлов и папок
// Сама рекурсивная функция для поиска файлов и папок bool FindFileAndDir( QString szDir) { qint16 qnFileCount = 0; QDir dir( szDir); foreach( QFileInfo fi, dir.entryInfoList()) { QString szFileName = fi.absoluteFilePath(); if( fi.isDir()) { if( fi.fileName()=="." || fi.fileName()=="..") continue; FindFileAndDir( szFileName); } if( fi.isFile()) { qnFileCount++; } } qDebug( "Dir: %s, File count: %d", qPrintable( szDir), qnFileCount); return true; } int main(int argc, char *argv[]) { QString szDir="c:\\windows\\system32\\drivers"; FindFileAndDir( szDir); return 0; }
[править] Другой вариант рекурсивного поиска файлов
QStringList fileFind(QString dirname) { QStringList files; foreach (QString dir, QDir(dirname).entryList(QStringList(),QDir::Dirs | QDir::NoDotAndDotDot)) files.append(fileFind(QDir(dirname).filePath(dir))); foreach (QString file, QDir(dirname).entryList(QStringList(),QDir::Files | QDir::NoDotAndDotDot)) files << QDir(dirname).filePath(file); return files; }
[править] Удаление директории с поддиректориями и файлами
// void DeleteAllFiles(const QString &path) { QDir oDir(path); QStringList files = oDir.entryList(QDir::Files); QStringList::Iterator itFile = files.begin(); while (itFile != files.end()) { QFile oFile(path + "/" + *itFile); oFile.remove(); ++itFile; } QStringList dirs = oDir.entryList(QDir::Dirs); QStringList::Iterator itDir = dirs.begin(); while (itDir != dirs.end()) { if (*itDir != "." && *itDir != "..") DeleteAllFiles(path + "/" + *itDir); ++itDir; } oDir.rmdir(path); } int main(int argc, char *argv[]) { QString path="c:\\windows\\system32"; // перед запуском измените путь, а то как бы чего не вышло! :) DeleteAllFiles( path); return 0; }
