MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
Qtの基礎 - 文字列のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
Qtの基礎 - 文字列
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == <br><br> == 数値を文字列に変換する == <code>QString::number()</code>を使用して、数値を文字列に変換する。<br> <br> 少数を変換する場合、第2引数に<code>e</code>または<code>E</code>を指定すると指数表記、<code>f</code>を指定すると少数表記になる。<br> この時、第3引数の数値は、小数点以下の桁数となる。<br> <br> 第2引数に<code>g</code>または<code>G</code>を指定すると、指数表記と少数表記のうち、より簡潔に表現できる方で変換される。<br> この時、第3引数の数値は、有効桁数となる。<br> <br> 第2引数の詳細は、[http://doc.qt.io/qt-5/qstring.html#argument-formats Qtの公式Webサイト]を参照すること。<br> <syntaxhighlight lang="c++"> int i = 10; qDebug() << QString::number(i); // 10進数として文字列化 qDebug() << QString::number(i, 8); // 8進数として文字列化 qDebug() << QString::number(i, 16); // 16進数として文字列化(アルファベット小文字) qDebug() << QString::number(i, 16).toUpper(); // 16進数として文字列化(アルファベット大文字) double d = 12.3456789; qDebug() << QString::number(d, 'e', 1); // 浮動小数12.3456789を小数点以下1桁で指数表記 qDebug() << QString::number(d, 'e', 7); // 浮動小数12.3456789を小数点以下7桁で指数表記 qDebug() << QString::number(d, 'f', 1); // 浮動小数12.3456789を小数点以下1桁で小数表記 --> 12.3 qDebug() << QString::number(d, 'f', 5); // 浮動小数12.3456789を小数点以下7桁で小数表記 --> 12.34568 qDebug() << QString::number(0.0000001, 'g', 7); // 浮動小数0.0000001を有効桁数7桁で簡潔表記 qDebug() << QString::number(1.2345678, 'g', 7); // 浮動小数1.2345678を有効桁数7桁で簡潔表記 qDebug() << QString((int)'A' + 2); // 16進数 0x0Cが文字Cに変換される </syntaxhighlight> <br><br> == 文字列を数値に変換する == <syntaxhighlight lang="c++"> QString numStr = "1234"; int i = numStr.toInt(); // i=1234 long l = numStr.toLong(); // l=1234 double d = numStr.toDouble(); // d=1234 </syntaxhighlight> <br><br> == 文字列の長さや数を取得する == <syntaxhighlight lang="c++"> QString txtStr = "ABC123:def12 6"; int sz = txtStr.length(); // 空白を含む文字数 sz=14 int ix = txtStr.indexOf("12"); // 指定文字列を最初に見つけた位置 ix=3 int cnt = txtStr.count("12"); // 指定文字列の個数 cnt=2 QString str = txtStr.at(1); // 指定位置の文字 str="B" </syntaxhighlight> <br> <u>※注意</u><br> <u>lengthは0x00も1文字として数える。</u><br> <br><br> == 文字列の確認 == <syntaxhighlight lang="c++"> QString txtStr = "ABC123:def126 "; bool bl = txtStr.contains("F12"); // 指定文字を含むか bl=false bool bl = txtStr.contains("F12", Qt::CaseInsensitive); // 指定文字を含むか bl=true bool bl = txtStr.startsWith("A"); // 指定文字から始まるか bl=true bool bl = txtStr.endsWith("6"); // 指定文字で終わるか bl=false(最後は空白) // isNullメソッドとisEmptyメソッドは異なる QString txtStr2 = ""; bool bl = txtStr.isEmpty(); // 空か bl=true bool bl = txtStr.isNull(); // NULLか bl=false </syntaxhighlight> <br> <u>※注意</u><br> <u><code>CaseInsensitive</code>を指定する場合、大文字・小文字の区別を無視する。</u><br> <u><code>startsWith</code>メソッドと<code>endsWith</code>メソッドも、<code>CaseInsensitive</code>を指定することができる。</u><br> <br><br> == 基本的な文字列操作 == <syntaxhighlight lang="c++"> QString txtStr = "ABC123:def126 "; QString str = txtStr.mid(1, 3); // 指定位置から指定文字数を切り出す str="BC1" QString str = txtStr.mid(3); // 指定位置以降の文字列を切り出す str="123:def126 " QString str = txtStr.left(1); // 先頭から指定文字数を切り出す str="A" QString str = txtStr.right(2); // 末尾から指定文字数を切り出す str="6 " QString str = txtStr.toLower(); // アルファベット小文字に変換する str="abc123:def126 " QString str = txtStr.toUpper(); // アルファベット大文字に変換する str="ABC123:DEF126 " QString str = txtStr.repeated(2); // 指定回数だけ繰り返す str="ABC123:def126 ABC123:def126 " </syntaxhighlight> <br> 以下の例では、元の文字列を書き換えるため、使用する場合は注意が必要である。<br> <syntaxhighlight lang="c++"> QString txtStr = "ABC123:def126 "; txtStr.replace(3, 2, "xy"); // 指定位置から指定文字数の置き換える txtStr="ABCxy3:def126 " txtStr.chop(2); // 末尾の指定文字数を削除する txtStr="ABCxy3:def12" txtStr.insert(1, QString("and")); // 指定位置の前に挿入する txtStr="AandBCxy3:def12" txtStr.fill('X', 4); // 文字を指定数並べる txtStr="XXXX" txtStr.setNum(2.5); // 数値を文字列に変換する txtStr="2.5" </syntaxhighlight> <br><br> == 文字列の右詰め == <syntaxhighlight lang="c++"> QString txtStr = "12345"; QString str = txtStr.rightJustified(8, '0'); // str="00012345" QString str = txtStr.rightJustified(8, '.'); // str="...12345" QString str = txtStr.rightJustified(3, '.', true); // str="123" QString str = txtStr.rightJustified(3, '.', false); // str="12345" QString str = QString::number(98).rightJustified(4, '0'); // str="0098" </syntaxhighlight> <br> <u>※注意</u><br> <u><code>rightJustified</code>メソッドの第3引数の初期値は、<code>false</code>である。<code>true</code>を指定すると指定桁数に切り詰める。</u><br> <br><br> == 空白の切り詰め == <code>simplified</code>メソッドは、空白・タブ・改行をまとめて1つの空白に置き換える。この時、先頭と末尾は削られる。<br> <code>trimmed</code>メソッドは、先頭と末尾の空白・タブ・改行を取り除く。<br> <syntaxhighlight lang="c++"> QString txtStr = "\t AB CD\n EF GH\tIJ\n\nKL \n"; QString str = txtStr.simplified(); str="AB CD EF GH IJ KL" QString str = txtStr.trimmed(); str="AB CD\n EF GH\tIJ\n\nKL" </syntaxhighlight> <br><br> == パディング == 以下の例では、1~1000までの整数を0001、0002、0003、...、1000という文字列にパディングしている。<br> <br> 第3引数(初期値 : false)の違いは、第1引数で指定した桁数を超える場合、後ろを切る捨てるか否かの設定である。<br> <syntaxhighlight lang="c++"> for(int i = 1; i <= 1000; i++) { qDebug() << QString::number(i).rightJustified(4, '0'); } for(int i = 1; i <= 1000; i++) { qDebug() << QString::number(i).rightJustified(4, '0', true); } </syntaxhighlight> <br> また、<code>rightJustified</code>メソッドは、文字列の先頭を空白で埋めるなどもできる。<br> <syntaxhighlight lang="c++"> QStringList list = {"a", "aa", "aaa", "aaaa", "aaaaa"}; for(QString str : list) { qDebug() << str.rightJustified(5, ' '); } </syntaxhighlight> <br><br> == 文字列の分割 == 以下の例では、文字列を区切り文字で分割して、文字列リスト(QStringList)に代入している。<br> <syntaxhighlight lang="c++"> QString txtStr = "ABC123:def12 "; QStringList list = txtStr.split(":"); // :(コロン)で分割する QString str = list[0]; // "ABC123" QString str = list[1]; // "def12 " </syntaxhighlight> <br> 以下の例では、ループで文字列リストを処理している。上記と同様の結果になる。<br> <syntaxhighlight lang="c++"> QString txtStr = "ABC123:def12 "; QStringList list = txtStr.split(":"); // :(コロン)で分割する for(int i = 0; i < list.count(); i++) { QString str = list.at(i); // list[i]でも同じ } foreach(QString word, list) { QString str = word; } </syntaxhighlight> <br><br> == 文字列の整形 == <code>arg</code>と<code>%</code>を使用して、文字列を整形できる。<br> <syntaxhighlight lang="c++"> QString str = QString("座標=(%1, %2) サイズ=%3x%4 テキスト=%5").arg(10).arg(20).arg(240).arg(120).arg("メッセージ"); // str="座標=(10, 20) サイズ=240x120 テキスト=メッセージ" </syntaxhighlight> <br> また、<code>printf</code>のように文字列を整形することもできる。<br> <syntaxhighlight lang="c++"> QString sDt="ABC"; QString str; // Qt 5.7以前 str.sprintf("%02d:%02d, %cクラス, 0x%04x, (%4.2lf), (%-3d), (%5s), (%.2s)", 9, 2, 'S', 255, 3.1415, 7, qPrintable(sDt), qPrintable(sDt)); // str="09:02, Sクラス, 0x00ff, (3.14), (7 ), ( ABC), (AB)" // Qt 5.7以降 QString str = QString::asprintf("%02d:%02d, %cクラス, 0x%04x, (%4.2lf), (%-3d), (%5s), (%.2s)", 9, 2, 'S', 255, 3.1415, 7, qPrintable(sDt), qPrintable(sDt)); // str="09:02, Sクラス, 0x00ff, (3.14), (7 ), ( ABC), (AB)" </syntaxhighlight> <br> <u>※注意</u><br> <u>半角英数の場合は<code>qPrintable</code>関数でも表示できるが、全角文字の場合は<code>QString</code>クラスの<code>toUtf8().constData()</code>を使用しないと文字化けする。</u><br> <u>また、Qt 5.7以降では、以下のように、<code>QString::asprintf</code>メソッドが使用できる。</u><br> <syntaxhighlight lang="c++"> QString str = QString::asprintf("フォーマット", データの並び); </syntaxhighlight> <br><br> == 文字列の先頭に挿入 == 先頭に文字列を挿入する場合、<code>QString</code>クラスの<code>prepend</code>メソッドを使用する。<br> このメソッドは、呼び出された文字列の先頭に指定した文字列を挿入する。<br> <br> <code>prepend</code>メソッドは呼び出し元の<code>QString</code>オブジェクト自体を変更するため、新たに変数を定義する必要はない。<br> <syntaxhighlight lang="c++"> QString str = "piyo fuga"; // 出力 : "piyo fuga" str.prepend("hoge "); // 出力 : "hoge piyo fuga" </syntaxhighlight> <br><br> == 特定の文字列の削除 == 以下の例では、<nowiki><table></nowiki>タグから<nowiki></table></nowiki>タグまでの文字列を正規表現を使用して削除している。<br> <br> <code>QRegularExpression::DotMatchesEverythingOption</code>オプションは、"."を使用することにより改行文字にもマッチするようにしている。<br> これは、<nowiki><table></nowiki>タグが複数行に跨っている場合でも対応するためである。<br> <br> <syntaxhighlight lang="c++"> QString description = R"(<div>Some content before the table <table><tr><td>Cell content</td></tr></table> and some content after.</div>)"; // "<table>"から"</table>"までの内容を含む正規表現パターン QRegularExpression tableTagPattern("<table.*>.*</table>", QRegularExpression::DotMatchesEverythingOption); // 該当するパターンを全て削除 description.remove(tableTagPattern); </syntaxhighlight> <br> <syntaxhighlight lang="c++"> QString strUTF16 = "Sample"; // LinuxまたはMacOSにおいて、UTF-8を使用している場合 std::string strUTF8 = strUTF16.toUtf8().constData(); // toStdStringメソッドは変換される文字列がUTF-8でエンコードされていることを前提としている // QStringが別のエンコーディング (例: UTF-16) を使用している場合、正しく変換されない可能性があるため注意 std::string strUTF8 = strUTF16.toStdString(); // Windowsにおいて、UTF-8を使用している場合 std::string strCurrentLocale = strUTF16.toLocal8Bit().constData(); </syntaxhighlight> <br> <syntaxhighlight lang="c++"> QString strData = "文字列"; QByteArray byaryData = strData.toUtf8(); // または #include <QTextCodec> QString strData = "文字列"; QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QByteArray byaryData = codec->fromUnicode(strData); </syntaxhighlight> <br> <syntaxhighlight lang="c++"> QByteArray byaryData = file.readAll(); QString strData = QString::fromUtf8(byaryData); </syntaxhighlight> <br> <syntaxhighlight lang="c++"> #include <QTextCodec> // Shift-JISでエンコードされた文字列 QString SJISText = QStringLiteral("こんにちは"); // Shift-JISでエンコードされた文字列 // Shift-JISのコーデックを取得 QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); // Shift-JISのQByteArrayに変換 QByteArray shiftJISBytes = codec->fromUnicode(SJISText); // UTF-8の文字列に変換 QString utf8String = QString::fromUtf8(shiftJISBytes); // または QString utf8String = codec->toUnicode(shiftJISBytes);; </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // UTF-8でエンコードされた文字列 QString utf8Text = QStringLiteral("こんにちは"); // Shift-JISのコーデックを取得 QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); // UTF-8のQStringをShift-JISのQByteArrayに変換 QByteArray shiftJISBytes = codec->fromUnicode(utf8Text); </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // UTF-8でエンコードされた文字列 QString utf8Text = QStringLiteral("こんにちは"); // EUC-JPのコーデックを取得 QTextCodec *codec = QTextCodec::codecForName("EUC-JP"); // UTF-8の文字列をEUC-JPのQByteArrayに変換 QByteArray eucJPBytes = codec->fromUnicode(utf8String); // EUC-JPエンコードされたデータを16進数で表示 std::cout << eucJPText.toHex() << std::endl; </syntaxhighlight> <br> <syntaxhighlight lang="c++"> #include <QCoreApplication> #include <QVariant> #include <cmath> QString convertNumberToString(const QVariant &value) { if (value.type() == QVariant::Int || value.type() == QVariant::LongLong) { // 数値が整数の場合 return value.toString(); // 戻り値が整数型の場合 //return value.toInt(); } else if (value.type() == QVariant::Double) { // 数値が浮動小数点の場合 double number = value.toDouble(); // 戻り値がQStringクラスの場合、小数点以下を切り捨て double intPart; std::modf(number, &intPart); return QString::number(intPart, 'f', 0); // 'f'フォーマットと0桁で小数点以下を除去 // 戻り値が整数型の場合 //return static_cast<int>(std::floor(number)); } // その他の型の場合は空のQStringを返す return QString(); // 戻り値が整数型の場合、その他の型の場合は0を返す //return 0; } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); // 整数を渡す例 QVariant intValue = 42; QString intResult = convertNumberToString(intValue); std::cout << QString("整数の結果 : %1").arg(intResult).toStdString() << std::endl; // "42"と表示 // 浮動小数点数を渡す例 QVariant floatValue = 42.56; QString floatResult = convertNumberToString(floatValue); std::cout << QString("浮動小数点数の結果(小数点以下除去) : %1").arg(floatResult).toStdString() << std::endl; // "42"と表示 return app.exec(); } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> QStringList list; list << "apple" << "banana" << "cherry"; // 特定の要素が存在するかどうかを確認 bool exists = list.contains("hoge"); if (exists) { qDebug() << "要素\"hoge\"が存在します"; } else { qDebug() << "要素\"hoge\"は存在しません"; } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> QStringList list = {"foo", "bar", "hoge", "baz"}; QMutableListIterator<QString> i(list); while (i.hasNext()) { if (i.next() == "hoge") { i.remove(); } } </syntaxhighlight><syntaxhighlight lang="c++"> // QStringListからQListへ変換 QStringList list = {"foo", "bar", "hoge", "baz"}; QList<QString> qlist = list; // 特定の要素を削除するラムダ式 (この場合は、要素"hoge"を削除) auto newEnd = std::remove_if(qlist.begin(), qlist.end(), [](const QString &value) { return value == "hoge"; }); // リストから要素を削除 qlist.erase(newEnd, qlist.end()); // QListからQStringListへ変換 list = QStringList::fromList(qlist); </syntaxhighlight> <br> <syntaxhighlight lang="c++"> QString description = R"(<div>Some content before the table <table><tr><td>Cell content</td></tr></table> and some content after.</div>)"; // "<table>"から"</table>"までの内容を含む正規表現パターン QRegularExpression tableTagPattern("<table.*>.*</table>", QRegularExpression::DotMatchesEverythingOption); // 該当するパターンを全て削除 description.remove(tableTagPattern); </syntaxhighlight> <br><br> == 改行文字の挿入 == QString型に改行文字を挿入することができる。<br> <br> プラットフォームに依存しない改行文字をQString型に格納する方法を、以下に示す。<br> <br> * QStringLiteralを使用する場合 <syntaxhighlight lang="c++"> QString a = QStringLiteral("\n"); </syntaxhighlight> <br> * QLatin1Charを使用する場合 <syntaxhighlight lang="c++"> QString a = QLatin1Char('\n'); </syntaxhighlight> <br> * QCharを使用する場合 <syntaxhighlight lang="c++"> QString a = QChar::LineFeed; </syntaxhighlight> <br> また、<code>Qt::endl</code>を使用する場合は、<code>QTextStream</code>クラスと組み合わせてQString型に挿入することもできる。<br> <syntaxhighlight lang="c++"> QString result; QTextStream stream(&result); stream << "First line" << Qt::endl << "Second line"; // resultに改行を含む文字列が格納される </syntaxhighlight> <br><br> == QString型からchar型またはstd::string型へ変換 == <code>QString</code>型はUTF-16でエンコードされているのに対して、<code>char</code>型または<code>std::string</code>型はどの種類のエンコーディングでもよいことに注意する。<br> <br> 以下の例では、<code>QString</code>型(UTF-16)から<code>char</code>型(UTF-8)または<code>std::string</code>型(UTF-8)へ変換している。<br> <syntaxhighlight lang="c++"> QString strUTF16 = "Sample"; // LinuxまたはMacOSにおいて、UTF-8を使用している場合 std::string strUTF8 = strUTF16.toUtf8().constData(); // toStdStringメソッドは変換される文字列がUTF-8でエンコードされていることを前提としている // QStringが別のエンコーディング (例: UTF-16) を使用している場合、正しく変換されない可能性があるため注意 std::string strUTF8 = strUTF16.toStdString(); // Windowsにおいて、UTF-8を使用している場合 std::string strCurrentLocale = strUTF16.toLocal8Bit().constData(); </syntaxhighlight> <br> また、<code>qPrintable(const QString &str)</code>マクロも存在しており、これは、<code><QString型のオブジェクト>.toLocal8Bit().constData()</code>に展開される。<br> <br><br> == char*型からQString型へ変換 == char*型からQString型への変換は、簡単に行うことができる。<br> <u>ただし、変換方法は、元のchar*型がどのエンコーディングで保存されているかにより異なることに注意する。</u><br> <br> * UTF-8エンコーディングの場合 <syntaxhighlight lang="c++"> char *pstr = "Hello, World!"; QString qstr = QString::fromUtf8(pstr); </syntaxhighlight> <br> * システムのローカルエンコーディングの場合 <syntaxhighlight lang="c++"> char *pstr = "Hello, World!"; QString qstr = QString::fromLocal8Bit(pstr); </syntaxhighlight> <br> * Latin-1 (ISO 8859-1) エンコーディングの場合 <syntaxhighlight lang="c++"> char *pstr = "Hello, World!"; QString qstr = QString::fromLatin1(pstr); </syntaxhighlight> <br> * エンコーディングが不明な場合や単純なASCIIの場合 <syntaxhighlight lang="c++"> char *pstr = "Hello, World!"; QString qstr = QString(pstr); </syntaxhighlight> <br> また、char*型の長さが既知の場合は、以下に示すようにオーバーロードされたバージョンを使用することができる。<br> <syntaxhighlight lang="c++"> char *pstr = "Hello, World!"; int length = 13; // "Hello, World!"の長さ QString qstr = QString::fromUtf8(pstr, length); </syntaxhighlight> <br> <u>※注意</u><br> * <u>可能な限り、<code>QString::fromUtf8()</code>や<code>QString::fromLocal8Bit()</code>を使用することを推奨する。</u><br>これらのメソッドは、文字エンコーディングを正しく扱うことができる。 * <code>QString(char*)</code>コンストラクタを使用する場合、QtはデフォルトでLatin-1エンコーディングを仮定する。<br>これは、非ASCII文字を含む文字列で問題を引き起こす可能性がある。 * char*型がnull終端されていることを確認する必要がある。<br>そうでない場合、長さを明示的に指定する必要がある。 * メモリ管理に注意すること。<br><u>動的にchar*型が割り当てられている場合、QString型に変換した後、元のchar*型が不要になった場合は適切に解放する必要がある。</u> <br><br> == QString型からQByteArray型へ変換 == <syntaxhighlight lang="c++"> QString strData = "文字列"; QByteArray byaryData = strData.toUtf8(); // または #include <QTextCodec> QString strData = "文字列"; QTextCodec *codec = QTextCodec::codecForName("UTF-8"); QByteArray byaryData = codec->fromUnicode(strData); </syntaxhighlight> <br><br> == QByteArray型からQString型へ変換 == <syntaxhighlight lang="c++"> QByteArray byaryData = file.readAll(); QString strData = QString::fromUtf8(byaryData); </syntaxhighlight> <br><br> == 文字エンコード == ==== Shift-JISからUTF-8へ変換 ==== <code>QTextCodec</code>クラスは、様々な文字エンコード間での文字列の変換をサポートしている。<br> <br> 以下の例では、<code>QString</code>クラスに格納されている文字列がShift-JISであると仮定しているが、実際には<code>QString</code>クラスは内部的にUTF-16を使用している。<br> したがって、本来変換が必要なものは、外部から入力されるShift-JISでエンコードされたデータ (例: ファイルやネットワーク経由で受信したデータ) を扱う場合である。<br> <br> そのため、実務等で使用する場合は、外部データを<code>QByteArray</code>クラスで受け取り、それを<code>QString</code>クラスに変換する時にエンコーディングを考慮する必要がある。<br> <syntaxhighlight lang="c++"> // Shift-JISでエンコードされた文字列 QString SJISText = QStringLiteral("こんにちは"); // Shift-JISでエンコードされた文字列 // Shift-JISのコーデックを取得 QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); // Shift-JISのQByteArrayに変換 QByteArray shiftJISBytes = codec->fromUnicode(SJISText); // UTF-8の文字列に変換 QString utf8String = QString::fromUtf8(shiftJISBytes); </syntaxhighlight> <br> ==== UTF-8からShift-JISへ変換 ==== 以下の例では、<code>QTextCodec::codecForName("Shift-JIS")</code>でShift-JISのQTextCodecオブジェクトを取得して、<br> <code>fromUnicode</code>メソッドを使用してUTF-8エンコードされた<code>QString</code>クラスをShift-JISエンコードされた<code>QByteArray</code>クラスに変換している。<br> <br> <code>QByteArray</code>クラスはバイナリデータを表すため、この変換により得られたバイト配列をファイルやネットワーク経由で送信する時にShift-JISとして扱うことができる。<br> <br> ただし、変換プロセス中に文字の損失や変換できない文字がある場合、<code>QTextCodec</code>クラスはデフォルトでその文字を<code>?</code>に置換、あるいは、無視する設定がある。<br> 変換の精度を高めるためには、<code>QTextCodec::ConverterOptions</code>を使用して、変換の挙動を細かく制御することが重要である。<br> <syntaxhighlight lang="c++"> // UTF-8でエンコードされた文字列 QString utf8Text = QStringLiteral("こんにちは"); // Shift-JISのコーデックを取得 QTextCodec *codec = QTextCodec::codecForName("Shift-JIS"); // UTF-8のQStringをShift-JISのQByteArrayに変換 QByteArray shiftJISBytes = codec->fromUnicode(utf8Text); </syntaxhighlight> <br> ==== UTF-8からEUC-JPへ変換 ==== <syntaxhighlight lang="c++"> // UTF-8でエンコードされた文字列 QString utf8Text = QStringLiteral("こんにちは"); // EUC-JPのコーデックを取得 QTextCodec *codec = QTextCodec::codecForName("EUC-JP"); // UTF-8の文字列をEUC-JPのQByteArrayに変換 QByteArray eucJPBytes = codec->fromUnicode(utf8String); // EUC-JPエンコードされたデータを16進数で表示 std::cout << eucJPText.toHex() << std::endl; </syntaxhighlight> <br><br> == その他の変換 == 以下の例では、数値が整数の場合はそのまま<code>QString</code>クラスへ変換、数値に小数点が含まれている場合は小数点以下を除去して<code>QString</code>クラスへ変換する関数である。<br> <br> <code>QVariant</code>クラスは、多くの異なるデータ型を格納することができる。<br> この柔軟性により、整数型だけでなく浮動小数点型等の様々な数値型をこの関数に渡すことが可能となる。<br> <syntaxhighlight lang="c++"> #include <QCoreApplication> #include <QVariant> #include <cmath> QString convertNumberToString(const QVariant &value) { if (value.type() == QVariant::Int || value.type() == QVariant::LongLong) { // 数値が整数の場合 return value.toString(); // 戻り値が整数型の場合 //return value.toInt(); } else if (value.type() == QVariant::Double) { // 数値が浮動小数点の場合 double number = value.toDouble(); // 戻り値がQStringクラスの場合、小数点以下を切り捨て double intPart; std::modf(number, &intPart); return QString::number(intPart, 'f', 0); // 'f'フォーマットと0桁で小数点以下を除去 // 戻り値が整数型の場合 //return static_cast<int>(std::floor(number)); } // その他の型の場合は空のQStringを返す return QString(); // 戻り値が整数型の場合、その他の型の場合は0を返す //return 0; } int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); // 整数を渡す例 QVariant intValue = 42; QString intResult = convertNumberToString(intValue); std::cout << QString("整数の結果 : %1").arg(intResult).toStdString() << std::endl; // "42"と表示 // 浮動小数点数を渡す例 QVariant floatValue = 42.56; QString floatResult = convertNumberToString(floatValue); std::cout << QString("浮動小数点数の結果(小数点以下除去) : %1").arg(floatResult).toStdString() << std::endl; // "42"と表示 return app.exec(); } </syntaxhighlight> <br><br> == QStringListクラス == ==== 特定の要素の確認 ==== <code>QStringList</code>クラスの要素群の中に特定の要素が存在する場合、<code>contains</code>メソッドを使用する。<br> <syntaxhighlight lang="c++"> QStringList list; list << "apple" << "banana" << "cherry"; // 特定の要素が存在するかどうかを確認 bool exists = list.contains("hoge"); if (exists) { qDebug() << "要素\"hoge\"が存在します"; } else { qDebug() << "要素\"hoge\"は存在しません"; } </syntaxhighlight> <br> ==== 特定の要素の削除 ==== <code>QStringList</code>クラス内の要素群から特定の要素を削除する。<br> <br> <code>QStringList</code>クラスは、<code>QList<QString></code>のtypedefであるため、<code>QList</code>クラスに変換して類似の処理を行うことが可能である。<br> <br> <u>※注意</u><br> <u><code>QStringList</code>やその他のQtのコンテナクラスにおいて、<code>std::remove_if</code>を直接使用することは推奨されていない。</u><br> <u>これは、QtのコンテナがC++ STLコンテナと異なる内部実装を持っているためである。</u><br> <br> 以下の例では、<code>QMutableListIterator</code>クラスを使用して、<code>QStringList</code>から特定の要素 (この場合は"hoge") を削除している。<br> <syntaxhighlight lang="c++"> QStringList list = {"foo", "bar", "hoge", "baz"}; QMutableListIterator<QString> i(list); while (i.hasNext()) { if (i.next() == "hoge") { i.remove(); } } </syntaxhighlight> <br> QtのコンテナクラスはC++ STLと完全な互換性は無いが、<code>QList</code>クラスに変換した後であれば<code>std::remove_if</code>メソッドを使用することができる。<br> 以下の例では、<code>std::remove_if</code>メソッドや<code>QList::erase</code>メソッドと組み合わせて、特定の要素 (この場合は"hoge") を削除している。<br> <syntaxhighlight lang="c++"> // QStringListからQListへ変換 QStringList list = {"foo", "bar", "hoge", "baz"}; QList<QString> qlist = list; // 特定の要素を削除するラムダ式 (この場合は、要素"hoge"を削除) auto newEnd = std::remove_if(qlist.begin(), qlist.end(), [](const QString &value) { return value == "hoge"; }); // リストから要素を削除 qlist.erase(newEnd, qlist.end()); // QListからQStringListへ変換 list = QStringList::fromList(qlist); </syntaxhighlight> <br> ==== 重複の削除 ==== * 推奨される方法 *: QList<T>(set.begin(), set.end())とQSet<T>(list.begin(), list.end())を使用することが推奨されています。以下のように修正できます。 <syntaxhighlight lang="c++"> #include <QStringList> #include <QSet> QStringList originalList = {"redhat", "redhat", "suse", "debian", "suse", "redhat"}; QSet<QString> uniqueSet(originalList.begin(), originalList.end()); QStringList uniqueList(uniqueSet.begin(), uniqueSet.end()); // 出力: ("redhat", "suse", "debian") qDebug() << "Unique List:" << uniqueList; </syntaxhighlight> <br> * 非推奨の方法 *: <code>QStringList::fromSet()</code>と<code>QStringList::toSet()</code>は非推奨である。 <syntaxhighlight lang="c++"> #include <QStringList> #include <QSet> QStringList originalList = {"redhat", "redhat", "suse", "debian", "suse", "redhat"}; QStringList uniqueList = QStringList::fromSet(originalList.toSet()); // 出力: ("redhat", "suse", "debian") qDebug() << "Unique List:" << uniqueList; </syntaxhighlight> <br><br> __FORCETOC__ [[カテゴリ:Qt]]
Qtの基礎 - 文字列
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse