Qt/FAQ/QtCore
Материал из Wiki.crossplatform.ru
Root (Обсуждение | вклад) (→Кодировка) |
512es (Обсуждение | вклад) м (→Другой вариант рекурсивного поиска файлов) |
||
(2 промежуточные версии не показаны) | |||
Строка 124: | Строка 124: | ||
QString szDir="c:\\windows\\system32\\drivers"; | QString szDir="c:\\windows\\system32\\drivers"; | ||
FindFileAndDir( szDir); | 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; | return 0; |
Текущая версия на 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; }