文字列「__FORCETOC__」を「{{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{…
 
(同じ利用者による、間の14版が非表示)
222行目: 222行目:
  QString str = "piyo fuga";  // 出力 : "piyo fuga"
  QString str = "piyo fuga";  // 出力 : "piyo fuga"
  str.prepend("hoge ");      // 出力 : "hoge 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 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>
  </syntaxhighlight>
<br><br>
<br><br>
244行目: 299行目:
<br>
<br>
また、<code>qPrintable(const QString &str)</code>マクロも存在しており、これは、<code><QString型のオブジェクト>.toLocal8Bit().constData()</code>に展開される。<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>
<br><br>


277行目: 374行目:
そのため、実務等で使用する場合は、外部データを<code>QByteArray</code>クラスで受け取り、それを<code>QString</code>クラスに変換する時にエンコーディングを考慮する必要がある。<br>
そのため、実務等で使用する場合は、外部データを<code>QByteArray</code>クラスで受け取り、それを<code>QString</code>クラスに変換する時にエンコーディングを考慮する必要がある。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <QTextCodec>
  // Shift-JISでエンコードされた文字列
  // Shift-JISでエンコードされた文字列
  QString SJISText = QStringLiteral("こんにちは");  // Shift-JISでエンコードされた文字列
  QString SJISText = QStringLiteral("こんにちは");  // Shift-JISでエンコードされた文字列
288行目: 387行目:
  // UTF-8の文字列に変換
  // UTF-8の文字列に変換
  QString utf8String = QString::fromUtf8(shiftJISBytes);
  QString utf8String = QString::fromUtf8(shiftJISBytes);
// または
QString utf8String = codec->toUnicode(shiftJISBytes);
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
299行目: 400行目:
変換の精度を高めるためには、<code>QTextCodec::ConverterOptions</code>を使用して、変換の挙動を細かく制御することが重要である。<br>
変換の精度を高めるためには、<code>QTextCodec::ConverterOptions</code>を使用して、変換の挙動を細かく制御することが重要である。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <QTextCodec>
  // UTF-8でエンコードされた文字列
  // UTF-8でエンコードされた文字列
  QString utf8Text = QStringLiteral("こんにちは");
  QString utf8Text = QStringLiteral("こんにちは");
311行目: 414行目:
==== UTF-8からEUC-JPへ変換 ====
==== UTF-8からEUC-JPへ変換 ====
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
#include <QTextCodec>
  // UTF-8でエンコードされた文字列
  // UTF-8でエンコードされた文字列
  QString utf8Text = QStringLiteral("こんにちは");
  QString utf8Text = QStringLiteral("こんにちは");
325行目: 430行目:
<br><br>
<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>
==== 重複の削除 ====
* 推奨される方法
*: <code>QList<T>(set.begin(), set.end())</code>と<code>QSet<T>(list.begin(), list.end())</code>を使用することが推奨される。<br>
<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>
{{#seo:
|title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki
|keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,電気回路,電子回路,基板,プリント基板
|description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux
|image=/resources/assets/MochiuLogo_Single_Blue.png
}}


__FORCETOC__
__FORCETOC__
[[カテゴリ:Qt]]
[[カテゴリ:Qt]]