Qt/FAQ/QtCore
Материал из Wiki.crossplatform.ru
Root (Обсуждение | вклад) |
512es (Обсуждение | вклад) м (→Другой вариант рекурсивного поиска файлов) |
||
(13 промежуточных версий не показаны.) | |||
Строка 1: | Строка 1: | ||
= QtCore - ядро не-GUI классов, используемое другими модулями = | = QtCore - ядро не-GUI классов, используемое другими модулями = | ||
== Строки == | == Строки == | ||
+ | За обработку строк в 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]] - классы для работы с таймерами. | ||
+ | |||
== Регулярные выражения == | == Регулярные выражения == | ||
== События == | == События == | ||
Строка 9: | Строка 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; }