Qt/FAQ/QtCore

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

Перейти к: навигация, поиск

Содержание

[править] 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;
}

[править] См. также