目次
- 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モジュール、面接の質問など) ↓↓↓↓下記参照↓↓料金受け取りは記事下部をクリック↓↓