細 文字列「__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 {{… |
|||
| (同じ利用者による、間の8版が非表示) | |||
| 227行目: | 227行目: | ||
== 特定の文字列の削除 == | == 特定の文字列の削除 == | ||
以下の例では、<nowiki><table></nowiki>タグから<nowiki></table></nowiki>タグまでの文字列を正規表現を使用して削除している。<br> | 以下の例では、<nowiki><table></nowiki>タグから<nowiki></table></nowiki>タグまでの文字列を正規表現を使用して削除している。<br> | ||
<br> | |||
<code>QRegularExpression::DotMatchesEverythingOption</code>オプションは、"."を使用することにより改行文字にもマッチするようにしている。<br> | <code>QRegularExpression::DotMatchesEverythingOption</code>オプションは、"."を使用することにより改行文字にもマッチするようにしている。<br> | ||
これは、<syntaxhighlight lang="c++"> | これは、<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>)"; | QString description = R"(<div>Some content before the table <table><tr><td>Cell content</td></tr></table> and some content after.</div>)"; | ||
| 236行目: | 239行目: | ||
// 該当するパターンを全て削除 | // 該当するパターンを全て削除 | ||
description.remove(tableTagPattern); | description.remove(tableTagPattern); | ||
</syntaxhighlight | </syntaxhighlight> | ||
<br> | |||
<syntaxhighlight lang="c++"> | <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>)"; | QString description = R"(<div>Some content before the table <table><tr><td>Cell content</td></tr></table> and some content after.</div>)"; | ||
| 393行目: | 249行目: | ||
// 該当するパターンを全て削除 | // 該当するパターンを全て削除 | ||
description.remove(tableTagPattern); | 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> | ||
| 415行目: | 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> | ||
| 448行目: | 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でエンコードされた文字列 | ||
| 459行目: | 387行目: | ||
// UTF-8の文字列に変換 | // UTF-8の文字列に変換 | ||
QString utf8String = QString::fromUtf8(shiftJISBytes); | QString utf8String = QString::fromUtf8(shiftJISBytes); | ||
// または | |||
QString utf8String = codec->toUnicode(shiftJISBytes); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
<br> | <br> | ||
| 470行目: | 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("こんにちは"); | ||
| 482行目: | 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("こんにちは"); | ||
| 613行目: | 547行目: | ||
==== 重複の削除 ==== | ==== 重複の削除 ==== | ||
* 推奨される方法 | * 推奨される方法 | ||
*: QList<T>(set.begin(), set.end()) | *: <code>QList<T>(set.begin(), set.end())</code>と<code>QSet<T>(list.begin(), list.end())</code>を使用することが推奨される。<br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
#include <QStringList> | #include <QStringList> | ||
| 642行目: | 576行目: | ||
<br><br> | <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]] | ||