Qt5の文字列について詳しく解説

目次

  • Qt5文字列の基本的な例
  • Qt5初期化文字列
  • Qt5 による文字列要素へのアクセス
  • Qt5の文字列の長さ
  • Qt5 ビルド文字列
  • Qt5 部分文字列
  • Qt5 文字列をループする
  • Qt5の文字列比較
  • Qt5変換文字列
  • 手紙
  • Qt5 文字列を変更する
  • Qt5 文字列を整列させる
  • Qt5エスケープ文字

この章では文字列を使用します。Qt5 には、文字列を操作するための QString クラスがあります。それは非常に強力であり、多くのメソッドがあります。

QString クラスは Unicode 文字列を提供します。文字列を 16 ビット QChar として保存します。各 QChar は Unicode 4.0 文字に対応します。他の多くのプログラミング言語の文字列とは異なり、QString は変更できます。

この章の例では、Qt GUI モジュールは必要なく、コマンドライン プログラムを作成します。Qt GUI はデフォルトで含まれているため、プロジェクト ファイルに QT -= gui 宣言を追加することで無効にできます。

この記事の特典として、Qt 開発学習教材パッケージ、技術ビデオ (Qt 実戦プロジェクト、C++ 言語基礎、C++ デザイン モード、Qt プログラミング入門、QT シグナルとスロット メカニズム、QT インターフェイス開発イメージ図) を無料で受け取ることができます。 、QTネットワーク、QTデータベースプログラミング、QTプロジェクトコンバット、QSS、OpenCV、Quickモジュール、面接の質問など) ↓↓↓↓下記参照↓↓料金受け取りは記事下部をクリック↓↓

Qt5文字列の基本的な例

最初の例では、QString クラスのいくつかの基本メソッドを使用します。

basic.cpp
#include <QTextStream>
 
int main(void) {
 
   QTextStream out(stdout);
 
   QString a { "love" };
 
   a.append(" chess");
   a.prepend("I ");
 
   out << a << endl;
   out << "The a string has " << a.count()
       << " characters" << endl;
 
   out << a.toUpper() << endl;
   out << a.toLower() << endl;
 
   return 0;
}

コード例では、QString を初期化しました。追加のテキストを追加したり、先頭に追加したりします。文字列の長さを出力します。最後に、変更した文字列を大文字と小文字で出力します。

QString a { "love" };

QString が初期化されます。

a.append(" chess");
a.prepend("I ");

テキストを最初の文字列に追加したり、先頭に追加したりします。文字列はその場で変更されます。

out << a << endl;

端末には「I love chess」と表示されます。

out << "The a string has " << a.count()
    << " characters" << endl;

count メソッドは、文字列内の文字数を返します。長さとサイズのメソッドは同等です。

out << a.toUpper() << endl;
out << a.toLower() << endl;

これら 2 つのメソッドは、文字列の大文字と小文字のコピーを返します。文字列は変更されず、文字列の新しい変更されたコピーが返されます。

$ ./basic
I love chess
The a string has 12 characters
I LOVE CHESS
i love chess

Qt5初期化文字列

QString はいくつかの方法で初期化できます。

init.cpp
#include <QTextStream>
 
int main(void) {
 
   QTextStream out(stdout);
 
   QString str1 = "The night train";
   out << str1 << endl;
 
   QString str2("A yellow rose");
   out << str2 << endl;
 
   QString str3 {"An old falcon"};
   out << str3 << endl;
 
   std::string s1 = "A blue sky";
   QString str4 = s1.c_str();
   out << str4 << endl;
 
   std::string s2 = "A thick fog";
   QString str5 = QString::fromLatin1(s2.data(), s2.size());
   out << str5 << endl;
 
   char s3[] = "A deep forest";
   QString str6(s3);
   out << str6 << endl;
 
   return 0;
}

QString を初期化する 5 つの方法を紹介しました。

QString str1 = "The night train";

これは、コンピュータ言語で文字列を初期化する伝統的な方法です。

QString str2("A yellow rose");

QStringを初期化するためのオブジェクトメソッドです。

QString str3 {"An old falcon"};

これは中括弧の初期化です。

std::string s1 = "A blue sky";
QString str4 = s1.c_str();

C++ 標準ライブラリから String オブジェクトを取得しました。その c_str メソッドを使用して、NULL で終了する文字シーケンスを生成します。この文字配列は文字列の古典的な C 表現であり、QString 変数に割り当てることができます。

std::string s2 = "A thick fog";
QString str5 = QString::fromLatin1(s2.data(), s2.size());

これらのコード行では、標準の C++ 文字列を QString に変換します。fromLatin1 メソッドを使用します。文字配列へのポインタを受け取ります。ポインタは std::string のデータ メソッドで返されます。2 番目のパラメータは std::string のサイズです。

char s3[] = "A deep forest";
QString str6(s3);

これは C 文字列であり、文字の配列です。QString コンストラクターの 1 つは、文字配列をパラメーターとして受け取ることができます。

$ ./init 
The night train
A yellow rose
An old falcon
A blue sky
A thick fog
A deep forest

Qt5 による文字列要素へのアクセス

QString は QChar のシーケンスです。文字列の要素には、[] 演算子または at メソッドを使用してアクセスできます。

access.cpp
#include <QTextStream>
 
int main(void) {
 
   QTextStream out(stdout);
 
   QString a { "Eagle" };
 
   out << a[0] << endl;
   out << a[4] << endl;
 
   out << a.at(0) << endl;
 
   if (a.at(5).isNull()) {
     out << "Outside the range of the string" << endl;
   }
 
   return 0;
}

特定の QString からいくつかの個別の文字を出力します。

out << a[0] << endl;
out << a[4] << endl;

文字列の最初と 5 番目の要素を出力します。

out << a.at(0) << endl;

at メソッドを使用して、文字列の最初の文字を取得します。

if (a.at(5).isNull()) {
    out << "Outside the range of the string" << endl;
}

文字列の文字範囲外の文字にアクセスしようとすると、at メソッドは null を返します。

$ ./access
E
e
E
Outside the range of the string

Qt5の文字列の長さ

文字列の長さを取得する 3 つの方法。サイズ、カウント、長さの方法。全員が同じことをします。指定された文字列内の文字数を返します。

length.cpp
#include <QTextStream>
 
int main(void) {
 
  QTextStream out(stdout);
 
  QString s1 = "Eagle";
  QString s2 = "Eagle\n";
  QString s3 = "Eagle ";
  QString s4 = "орел";
 
  out << s1.length() << endl;
  out << s2.length() << endl;
  out << s3.length() << endl;
  out << s4.length() << endl;
 
  return 0;
}

4 つの文字列のサイズを取得します。

QString s2 = "Eagle\n";
QString s3 = "Eagle ";

これら 2 つの文字列にはそれぞれ空白文字が含まれています。

QString s4 = "орел";

文字列はロシア語の文字で構成されます。

$ ./length
5
6
6
4

出力から、length メソッドでは空白文字もカウントされることがわかります。

Qt5 ビルド文字列

動的な文字列構築により、特定の制御文字を実際の値に置き換えることができます。補間には arg メソッドを使用します。

building.cpp
#include <QTextStream>
 
int main() {
 
   QTextStream out(stdout);
 
   QString s1 = "There are %1 white roses";
   int n = 12;
 
   out << s1.arg(n) << endl;
 
   QString s2 = "The tree is %1 m high";
   double h = 5.65;
 
   out << s2.arg(h) << endl;
 
   QString s3 = "We have %1 lemons and %2 oranges";
   int ln = 12;
   int on = 4;
 
   out << s3.arg(ln).arg(on) << endl;
 
   return 0;
}

置換されるトークンは % 文字で始まります。次の文字はパラメータを指定する数字です。文字列には複数のパラメータを含めることができます。arg メソッドはオーバーロードされており、整数、長い数値、文字、QChar などを受け入れることができます。

QString s1 = "There are %1 white roses";
int n = 12;

%1 は置換する予定のタグです。整数を定義します。

out << s1.arg(n) << endl;

arg メソッドは整数を受け入れます。%1 トークンは、n 変数の値に置き換えられます。

QString s2 = "The tree is %1 m high";
double h = 5.65;

out << s2.arg(h) << endl;

这三行对double做同样的事情。 自动调用正确的 arg 方法。
QString s3 = "We have %1 lemons and %2 oranges";
int ln = 12;
int on = 4;

out << s3.arg(ln).arg(on) << endl;

複数の制御文字を持つことができます。%1 は最初のパラメータを指し、%2 は 2 番目のパラメータを指します。arg メソッドは継続チェーンで呼び出されます。

この記事の特典として、Qt 開発学習教材パッケージ、技術ビデオ (Qt 実戦プロジェクト、C++ 言語基礎、C++ デザイン モード、Qt プログラミング入門、QT シグナルとスロット メカニズム、QT インターフェイス開発イメージ図) を無料で受け取ることができます。 、QTネットワーク、QTデータベースプログラミング、QTプロジェクトコンバット、QSS、OpenCV、Quickモジュール、面接の質問など) ↓↓↓↓下記参照↓↓料金受け取りは記事下部をクリック↓↓

$ ./building
There are 12 white roses
The tree is 5.65 m high
We have 12 lemons and 4 oranges

Qt5 部分文字列

テキスト処理を行うときは、通常の文字列の部分文字列を見つける必要があります。自由に使える左、中、右のメソッドがあります。

substrings.cpp
#include <QTextStream>
 
int main(void) {
 
   QTextStream out(stdout);
 
   QString str = { "The night train" };
 
   out << str.right(5) << endl;
   out << str.left(9) << endl;
   out << str.mid(4, 5) << endl;
 
   QString str2("The big apple");
   QStringRef sub(&str2, 0, 7);
 
   out << sub.toString() << endl;
 
   return 0;
}

3 つの方法すべてを使用して、指定された文字列の特定の部分文字列を検索します。

out << str.right(5) << endl;

right を使用すると、str 文字列の右端の 5 文字が取得されます。「電車」が印刷されています。

out << str.left(9) << endl;

left メソッドを使用すると、str 文字列の左端の 9 文字を取得します。「夜」がプリントされています。

out << str.mid(4, 5) << endl;

Mid メソッドを使用すると、4 番目の位置から始まる 5 つの文字が取得されます。「夜」を印刷します。

QString str2("The big apple");
QStringRef sub(&str2, 0, 7);

QStringRef クラスは、QString の読み取り専用バージョンです。ここでは、str2 文字列の一部である QStringRef を作成します。2 番目のパラメータは位置、3 番目のパラメータは部分文字列の長さです。

$ ./substrings
train
The night
night
The big

Qt5 文字列をループする

QString は QChar で構成されます。QString をループして文字列の各要素にアクセスできます。

looping.cpp
#include <QTextStream>
 
int main(void) {
 
  QTextStream out(stdout);
 
  QString str { "There are many stars." };
 
  for (QChar qc: str) {
    out << qc << " ";
  }
 
  out << endl;
 
  for (QChar *it=str.begin(); it!=str.end(); ++it) {
    out << *it << " " ;
  }
 
  out << endl;
 
  for (int i = 0; i < str.size(); ++i) {
    out << str.at(i) << " ";
  }
 
  out << endl;
 
  return 0;
}

QString をトラバースする 3 つの方法を示します。それらを端末に出力するとき、文字の間にスペース文字を追加します。

for (QChar qc: str) {
  out << qc << " ";
}

範囲ベースの for ループを使用して文字列を反復処理します。

for (QChar *it=str.begin(); it!=str.end(); ++it) {
  out << *it << " " ;
}

このコードでは、イテレータを使用して文字列を反復処理します。

for (int i = 0; i < str.size(); ++i) {
  out << str.at(i) << " ";
}
$ ./looping
T h e r e   a r e   m a n y   s t a r s .
T h e r e   a r e   m a n y   s t a r s .
T h e r e   a r e   m a n y   s t a r s .

Qt5の文字列比較

QString::compare 静的メソッドは、2 つの文字列を比較するために使用されます。このメソッドは整数を返します。戻り値がゼロより小さい場合、最初の文字列は 2 番目の文字列より小さいことになります。ゼロを返す場合、2 つの文字列は等しいです。最後に、戻り値がゼロより大きい場合は、最初の文字列が 2 番目の文字列より大きいことになります。「less」は、文字列の特定の文字が文字テーブル内の別の文字よりも前にあることを意味します。

文字列は次の方法で比較されます: 2 つの文字列の最初の文字が比較され、それらが等しい場合は、いくつかの異なる文字が見つかるか、すべての文字が一致することが見つかるまで、次の 2 つの文字が比較されます。

comparing.cpp
#include <QTextStream>
 
#define STR_EQUAL 0
 
int main(void) {
 
   QTextStream out(stdout);
 
   QString a { "Rain" };
   QString b { "rain" };
   QString c { "rain\n" };
 
   if (QString::compare(a, b) == STR_EQUAL) {
     out << "a, b are equal" << endl;
   } else {
     out << "a, b are not equal" << endl;
   }
 
   out << "In case insensitive comparison:" << endl;
 
   if (QString::compare(a, b, Qt::CaseInsensitive) == STR_EQUAL) {
     out << "a, b are equal" << endl;
   } else {
     out << "a, b are not equal" << endl;
   }
 
   if (QString::compare(b, c) == STR_EQUAL) {
     out << "b, c are equal" << endl;
   } else {
     out << "b, c are not equal" << endl;
   }
 
   c.chop(1);
 
   out << "After removing the new line character" << endl;
 
   if (QString::compare(b, c) == STR_EQUAL) {
     out << "b, c are equal" << endl;
   } else {
     out << "b, c are not equal" << endl;
   }
 
   return 0;
}

大文字と小文字を区別する比較と区別しない比較には、Compare メソッドを使用します。

#define STR_EQUAL 0

コードをわかりやすくするために、STR_EQUAL 定数を定義します。

QString a { "Rain" };
QString b { "rain" };
QString c { "rain\n" };

これら 3 つの文字列を比較しています。

if (QString::compare(a, b) == STR_EQUAL) {
    out << "a, b are equal" << endl;
} else {
    out << "a, b are not equal" << endl;
}

a 文字列と b 文字列を比較しますが、それらは等しくありません。最初の文字が異なります。

if (QString::compare(a, b, Qt::CaseInsensitive) == STR_EQUAL) {
    out << "a, b are equal" << endl;
} else {
    out << "a, b are not equal" << endl;
}

大文字と小文字を区別しない比較では、文字列は等しいと見なされます。Qt::CaseInsensitive は、大文字と小文字を区別せずに比較します。

c.chop(1);

Chop メソッドは、C 文字列から最後の文字を削除します。これで、b 文字列と c 文字列が等しくなります。

$ ./comparing
a, b are not equal
In case insensitive comparison:
a, b are equal
b, c are not equal
After removing the new line character
b, c are equal

Qt5変換文字列

多くの場合、文字列を他のデータ型に変換したり、その逆に変換したりする必要があります。toInt、toFloat、toLong は、文字列を整数、浮動小数点数、および長整数に変換する 3 つの QString メソッドです。(このようなメソッドは他にもたくさんあります。) setNum メソッドは、さまざまな数値データ型を文字列に変換します。メソッドがオーバーロードされ、正しいメソッドが自動的に呼び出されます。

converting.cpp
#include <QTextStream>
 
int main(void) {
 
  QTextStream out(stdout);
 
  QString s1 { "12" };
  QString s2 { "15" };
  QString s3, s4;
 
  out << s1.toInt() + s2.toInt() << endl;
 
  int n1 = 30;
  int n2 = 40;
 
  out << s3.setNum(n1) + s4.setNum(n2) << endl;
 
  return 0;
}

この例では、2 つの文字列を整数に変換して加算します。次に、2 つの整数を文字列に変換して連結します。

out << s1.toInt() + s2.toInt() << endl;

toInt メソッドは文字列を整数に変換します。文字列から変換された 2 つの数値を加算します。

out << s3.setNum(n1) + s4.setNum(n2) << endl;

この場合、setNum メソッドは整数を文字列に変換します。2 つの文字列を連結します。

$ ./converting
27
3040

手紙

文字は、数字、文字、スペース、句読点などのさまざまなカテゴリに分類されます。各 QString は QChar で構成されます。QChar には、仕事を完了するための isDigit、isLetter、isSpace、および isPunct メソッドがあります。

letters.cpp
#include <QTextStream>
 
int main(void) {
 
  QTextStream out(stdout);
 
  int digits  = 0;
  int letters = 0;
  int spaces  = 0;
  int puncts  = 0;
 
  QString str { "7 white, 3 red roses." };
 
  for (QChar s : str) {
 
    if (s.isDigit()) {
      digits++;
    } else if (s.isLetter()) {
      letters++;
    } else if (s.isSpace()) {
      spaces++;
    } else if (s.isPunct()) {
      puncts++;
    }
  }
 
  out << QString("There are %1 characters").arg(str.count()) << endl;
  out << QString("There are %1 letters").arg(letters) << endl;
  out << QString("There are %1 digits").arg(digits) << endl;
  out << QString("There are %1 spaces").arg(spaces) << endl;
  out << QString("There are %1 punctuation characters").arg(puncts) << endl;
 
  return 0;
}

この例では、単純な文を定義します。その文に含まれる数字、文字、スペース、句読点の数を数えます。

int digits  = 0;
int letters = 0;
int spaces  = 0;
int puncts  = 0;

文字クラスごとに整数変数を定義します。

QString str { "7 white, 3 red roses." };

要チェックの文です。

for (QChar s : str) {

  if (s.isDigit()) {
    digits++;
  } else if (s.isLetter()) {
    letters++;
  } else if (s.isSpace()) {
    spaces++;
  } else if (s.isPunct()) {
    puncts++;
  }
}

for-range ベースのループを使用して QString を参照します。各要素は QChar です。QChar クラスのメソッドを使用して、文字のカテゴリを決定します。

out << QString("There are %1 characters").arg(str.count()) << endl;
out << QString("There are %1 letters").arg(letters) << endl;
out << QString("There are %1 digits").arg(digits) << endl;
out << QString("There are %1 spaces").arg(spaces) << endl;
out << QString("There are %1 punctuation characters").arg(puncts) << endl;

文字列補間を使用して、これらの数値を端末に出力します。

$ ./letters
There are 21 characters
There are 13 letters
There are 2 digits
There are 4 spaces
There are 2 punctuation characters

Qt5 文字列を変更する

一部のメソッド (toLower メソッドなど) は、元の文字列の新しい変更されたコピーを返します。他のメソッドは文字列をその場で変更します。その一部をご紹介します。

modify.cpp
#include <QTextStream>
 
int main(void) {
 
   QTextStream out(stdout);
 
   QString str { "Lovely" };
   str.append(" season");
 
   out << str << endl;
 
   str.remove(10, 3);
   out << str << endl;
 
   str.replace(7, 3, "girl");
   out << str << endl;
 
   str.clear();
 
   if (str.isEmpty()) {
     out << "The string is empty" << endl;
   }
 
   return 0;
}

文字列を適切に変更するための 4 つの方法について説明します。

str.append("シーズン")。
append メソッドは、文字列の末尾に新しい文字列を追加します。

str.remove(10, 3);
Remove メソッドは、文字列から 10 番目から 3 文字を削除します。

str.replace(7, 3, "girl");
replace メソッドは、位置 7 から始まる 3 文字を指定された文字列に置き換えます。

str.clear();
clear メソッドは文字列をクリアします。

$ ./modify
Lovely season
Lovely sea
Lovely girl
The string is empty

Qt5 文字列を整列させる

きちんとした出力を行うことは一般的な要件です。leftJustified メソッドと rightJustified メソッドを使用して文字列を揃えることができます。

right_align.cpp
#include <QTextStream>
 
int main(void) {
 
   QTextStream out(stdout);
 
   QString field1 { "Name: " }; 
   QString field2 { "Occupation: " }; 
   QString field3 { "Residence: " }; 
   QString field4 { "Marital status: " }; 
 
   int width = field4.size();
 
   out << field1.rightJustified(width, ' ') << "Robert\n";
   out << field2.rightJustified(width, ' ') << "programmer\n";
   out << field3.rightJustified(width, ' ') << "New York\n";
   out << field4.rightJustified(width, ' ') << "single\n";
 
   return 0;
}

この例では、フィールド文字列を右に揃えます。

int width = field4.size().
最も幅の広い文字列のサイズを計算します。

out << field1.rightJustified(width, ' ') << "Robert\n";
rightJustified メソッドは、width 文字を含む文字列を返します。文字列が短い場合、残りは指定された文字で埋められます。この場合、それはスペース文字です。

$ ./right_align
          Name: Robert
    Occupation: programmer
     Residence: New York
Marital status: single

Qt5エスケープ文字

Qt5 には、プレーン テキスト文字列を HTML 文字列に変換し、HTML メタ文字 <、>、&、および " を HTML 名前付きエンティティに置き換える toHtmlEscaped メソッドがあります。

$ cat cprog.c
#include <stdio.h>
 
int main(void) {
 
    for (int i=1; i<=10; i++) {
      
        printf("Bottle %d\n", i);
    }
}

この C 言語プログラムには HTML メタキャラクターが含まれています。

html_escape.cpp
#include <QTextStream>
#include <QFile>
 
int main(void) {
 
    QTextStream out(stdout);
 
    QFile file("cprog.c");
 
    if (!file.open(QIODevice::ReadOnly)) {
 
        qWarning("Cannot open file for reading");
        return 1;
    }
 
    QTextStream in(&file);
 
    QString allText = in.readAll();
    out << allText.toHtmlEscaped() << endl;
 
    file.close();
 
    return 0;
}

この例では、C プログラムを読み取り、メタキャラクターを名前付きエンティティに置き換えます。

この記事の特典として、Qt 開発学習教材パッケージ、技術ビデオ (Qt 実戦プロジェクト、C++ 言語基礎、C++ デザイン モード、Qt プログラミング入門、QT シグナルとスロット メカニズム、QT インターフェイス開発イメージ図) を無料で受け取ることができます。 、QTネットワーク、QTデータベースプログラミング、QTプロジェクトコンバット、QSS、OpenCV、Quickモジュール、面接の質問など) ↓↓↓↓下記参照↓↓料金受け取りは記事下部をクリック↓↓

おすすめ

転載: blog.csdn.net/m0_73443478/article/details/132560655