Qt/FAQ/QtCore

Материал из Wiki.crossplatform.ru

(Различия между версиями)
Перейти к: навигация, поиск
(Работа с файлами и директориями)
(Другой вариант рекурсивного поиска файлов и папок)
Строка 127: Строка 127:
return 0;
return 0;
}</source>
}</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>
=== Удаление директории с поддиректориями и файлами ===
=== Удаление директории с поддиректориями и файлами ===

Версия 01:37, 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);


Массивы

Контейнеры

Дата и время

Классы работы с датой можно разделить на две группы:

  1. QDateTime, QDate, QTime - классы предоставляющие функции для работы с датой и временем.
  2. 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;
}

См. также