Qt/FAQ/QtCore

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

(Различия между версиями)
Перейти к: навигация, поиск
(Строки)
м (Другой вариант рекурсивного поиска файлов)
 
(12 промежуточных версий не показаны.)
Строка 1: Строка 1:
= QtCore - ядро не-GUI классов, используемое другими модулями =
= QtCore - ядро не-GUI классов, используемое другими модулями =
== Строки ==
== Строки ==
-
За обработку строк в Qt отвечает класс QString.
+
За обработку строк в 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]]  - классы для работы с таймерами.
 +
== Регулярные выражения ==
== Регулярные выражения ==
== События ==  
== События ==  
Строка 14: Строка 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);


[править] Массивы

[править] Контейнеры

[править] Дата и время

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

  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;
}

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