# Qt4 工具类

> 原文： [http://zetcode.com/gui/qt4/utilityclasses/](http://zetcode.com/gui/qt4/utilityclasses/)

在 Qt4 C++ 编程教程的这一部分中，我们将讨论 Qt4 库中可用的工具类。

Qt4 库由一大堆帮助程序类组成，它们可以帮助程序员完成工作。 这些包括用于处理字符串，文件，XML 文件，流，数据库或网络的类。 在这里，我们只显示了整个湖面的一小滴。

Qt4 库可用于创建控制台和 GUI 应用。 在本章中，我们将说明基于控制台的应用中的一些帮助程序类。

## 将文本打印到控制台

这是一个简单的控制台应用。 该应用将一些文本放入控制台窗口。

`console.cpp`

```cpp
#include <iostream>

int main() {

  std::cout << "console application\n";
}

```

在第一个示例中，我们使用 STL（标准模板库）库打印文本。

`console2.cpp`

```cpp
#include <QTextStream>

int main() {

   QTextStream out(stdout);
   out << "console application\n";
}

```

第二个示例显示了如何使用 Qt4 编程库打印文本。

`Output`

```cpp
$ ./console 
console application

```

## `QFile`

`QFile`是用于读取和写入文件的类。

在第一个示例中，我们将一行写入文件中。

`write_line.cpp`

```cpp
#include <QTextStream>
#include <QFile>

int main() {

   QFile data("myfile");

   if (data.open(QFile::WriteOnly)) {

     QTextStream out(&data);
     out << "You make me want to be a better man." << endl;
   }
}

```

在只写模式下创建名为`myfile`的文件。 `QTextStream`类用于在文件中插入一行。

`Output`

```cpp
$ cat myfile 
You make me want to be a better man.

```

下一个示例将文件的内容打印到控制台。 文本将使用匈牙利语，因此我们必须设置正确的编解码器。

`szerelem`

```cpp
S a régi szeretőmér­
mit nem cselekednék,
tengerből a vizet
kanállal lemerném.

S a tenger fenekéről
apró gyöngyöt szednék,
s a régi szeretőmnek
gyöngykoszorút kötnék. 

```

这些是`szerelem`文件的内容。

`szerelem.cpp`

```cpp
#include <QTextStream>
#include <QFile>

int main() {

  QFile data("szerelem");

  QString line;

  if (data.open(QFile::ReadOnly)) {

    QTextStream in(&data);
    QTextStream out(stdout);

    out.setCodec("UTF-8");
    in.setCodec("UTF-8");

    do {

      line = in.readLine();
      out << line << endl;
    } while (!line.isNull());
  }
}

```

该示例以只读模式打开文件，并逐行打印其内容。

```cpp
out.setCodec("UTF-8");
in.setCodec("UTF-8");

```

由于匈牙利语言包含基本 Latin1 字符集以外的字符，因此我们将编解码器设置为 UTF-8，它能够显示所有可能的字符。

```cpp
do {

    line = in.readLine();
    out << line << endl;
} while (!line.isNull());

```

在此循环中，我们逐行读取和打印文件的内容。 `readLine()`方法从流中读取下一行。 如果流已读取到文件末尾，则`readLine()`将返回空`QString`。

`Output`

```cpp
$ ./szerelem
 S a régi szeretőmér­
mit nem cselekednék,
tengerből a vizet
kanállal lemerném.

S a tenger fenekéről
apró gyöngyöt szednék,
s a régi szeretőmnek
gyöngykoszorút kötnék. 

```

## `QList`

`QList`是通用 Qt4 的容器之一。 它用于存储值列表，并提供基于索引的快速访问以及快速插入和删除。

`mlist.cpp`

```cpp
#include <QTextStream>
#include <QList>

int main() {

  QTextStream out(stdout);

  QList<QString> list;

  list << "Balzac" << "Tolstoy" << "Guldbrassen"
       << "London" << "Galsworthy" << "Sienkiewicz";

  qSort(list);

  for (int i = 0; i < list.size(); ++i) {

    out << list.at(i) << endl;
  }

}

```

在代码示例中，我们创建了一个伟大的小说家列表。 我们按字母顺序对列表进行排序，然后将其打印到控制台。

`Output`

```cpp
$ ./mlist 
Balzac
Galsworthy
Guldbrassen
London
Sienkiewicz
Tolstoy

```

## `QDir`

`QDir`类提供对目录结构及其内容的访问。

`home_dir.cpp`

```cpp
#include <QTextStream>
#include <QDir>

int main() {

  QTextStream out(stdout);

  QString home = QDir::homePath();
  out << home << endl;
}

```

本示例确定主目录并将其打印到控制台。

`Output`

```cpp
$ ./home_dir
/home/janbodnar

```

在下面的示例中，我们使用`QDir`类

`filters.cpp`

```cpp
#include <QTextStream>
#include <QDir>

int main() {

  QTextStream out(stdout);
  QDir dir;

  QStringList filters;
  filters << "*.c" << "*.c~";
  dir.setNameFilters(filters);

  QFileInfoList list = dir.entryInfoList();

  for (int i=0; i<list.size(); ++i) {

    QFileInfo fileInfo = list.at(i);
    out << QString("%1").arg(fileInfo.fileName());
    out << endl;
  } 
}

```

该代码示例确定当前目录中的所有文件，并对文件应用特定的过滤器。

`Output`

```cpp
$ ls -F
anim*  anim.c  anim.c~  filters*  sun.png
$ ./filters 
anim.c
anim.c~

```

## `QTime`

`QTime`类提供时钟时间功能。

在以下示例中，我们将当前本地时间打印到控制台。

`local_time.cpp`

```cpp
#include <QTextStream>
#include <QTime>

int main() {

   QTextStream out(stdout);

   QTime qtime = QTime::currentTime();
   QString stime = qtime.toString(Qt::LocalDate);

   out << stime << endl;
}

```

请注意，不得将文件命名为`time.cpp`。

`Output`

```cpp
$ ./local_time 
10:30:33 PM

```

## `QString`

`QString`类用于处理字符串。 这可能是 Qt4 编程库中可用的最重要的工具类。

`concat.cpp`

```cpp
#include <QTextStream>

int main() {

   QString a = "Disziplin ";
   QString b = "ist ";
   QString c = "Macht.\n";

   QTextStream out(stdout);
   out << a + b + c;
}

```

第一个示例连接三个字符串。

`Output`

```cpp
$ ./concat
Disziplin ist Macht.

```

第二个示例通过一个接一个的附加文本来构建字符串。

`append.cpp`

```cpp
#include <QTextStream>

int main() {

   QString string = "Whether I shall ";

   string.append("turn out to be the hero of my own life, \n");
   string.append("or whether that station will be held by anybody else, \n");
   string.append("these pages must show.\n");

   QTextStream out(stdout);
   out << string;
}

```

`QString`的`append()`方法将给定字符串附加到该字符串的末尾。

`Output`

```cpp
$ ./append
Whether I shall turn out to be the hero of my own life, 
or whether that station will be held by anybody else, 
these pages must show.

```

下一个示例显示了参数替换。

`arg.cpp`

```cpp
#include <QTextStream>

int main() {

   QString string = "What if I gave you %1 red roses?";
   int num = 21;

   QTextStream out(stdout);
   out << string.arg(num) << endl; 
}

```

`arg()`方法返回字符串的副本，在该字符串中，它用提供的整数值替换`%1`标记。

`Output`

```cpp
$ ./arg 
What if I gave you 21 red roses?

```

以下示例显示了如何确定字符串的大小。

`size.cpp`

```cpp
#include <QTextStream>

int main() {

 QString string = "The history of my life.";

 QTextStream out(stdout);
 out << "The string has " + QString::number(string.size())
    + " characters." << endl; 
}

```

`size()`方法返回此字符串中的字符数。 为了将数字与前面的字符串连接起来，我们使用`number()`方法，该方法返回与给定数字等效的字符串。

`Output`

```cpp
$ ./size
The string has 23 characters.

```

最后一个示例是关于使字符串大写或小写。

`uplow.cpp`

```cpp
#include <QTextStream>

int main() {

  QString string = "The history of my life.";

  QTextStream out(stdout);
  out << string.toLower() << endl; 
  out << string.toUpper() << endl; 
}

```

`toLower()`方法返回字符串的小写副本，`toUpper()`方法返回字符串的大写副本。

`Output`

```cpp
$ ./uplow
the history of my life.
THE HISTORY OF MY LIFE.

```

在本章中，我们描述了 Qt4 中的一些工具类。