QTextStreamで進数を操る:integerBase()とsetIntegerBase()の使い方
具体的には以下の通りです。
- 基数の設定
setIntegerBase()
関数を使って、読み書きする整数の基数を明示的に設定できます。例えば、16進数で読み書きしたい場合はsetIntegerBase(16)
と設定します。 - デフォルトの動作
- 読み取り時
デフォルトでは0
が返されます。これは、QTextStream
が数値のプレフィックス(例:0x
は16進数、0
から始まる場合は8進数)を自動的に検出して基数を判断することを意味します。 - 書き込み時
デフォルトでは10
(10進数)が使用されます。
- 読み取り時
- 用途
QTextStream
を使ってファイルや文字列から整数を読み取ったり、ファイルや文字列に整数を書き込んだりする際に、その数値がどの進数で扱われるかを知ることができます。 - 戻り値
int
型で、現在の基数(例:10進数なら10、16進数なら16)を返します。
#include <QTextStream>
#include <QString>
#include <QDebug>
int main() {
QString s = "100 0xFF 010"; // 10進数、16進数、8進数
QTextStream in(&s);
qDebug() << "現在の基数 (読み取り時):" << in.integerBase(); // デフォルトは0
int num1, num2, num3;
in >> num1; // 10進数として読み込まれる
qDebug() << "num1:" << num1; // 出力: num1: 100
// 基数を16進数に設定して読み込む
in >> Qt::hex >> num2; // "0xFF"が16進数として読み込まれる
qDebug() << "num2:" << num2; // 出力: num2: 255
// 基数を10進数に戻してから、8進数を読み込む
in >> Qt::dec >> num3; // "010"が10進数として読み込まれてしまう
qDebug() << "num3 (自動検出なし):" << num3; // 出力: num3 (自動検出なし): 10
// QTextStreamが自動的に基数を検出する場合
QString s2 = "100 0xFF 010";
QTextStream in2(&s2);
int autoNum1, autoNum2, autoNum3;
in2 >> autoNum1 >> autoNum2 >> autoNum3; // 自動的に検出される
qDebug() << "autoNum1:" << autoNum1; // 出力: autoNum1: 100
qDebug() << "autoNum2:" << autoNum2; // 出力: autoNum2: 255
qDebug() << "autoNum3:" << autoNum3; // 出力: autoNum3: 8 (010は8進数として扱われる)
// 書き込みの例
QString outputString;
QTextStream out(&outputString);
out << 255;
qDebug() << "10進数書き込み:" << outputString; // 出力: 10進数書き込み: "255"
outputString.clear();
out << Qt::hex << 255;
qDebug() << "16進数書き込み:" << outputString; // 出力: 16進数書き込み: "ff"
outputString.clear();
out << Qt::oct << 10; // 10を8進数で出力
qDebug() << "8進数書き込み:" << outputString; // 出力: 8進数書き込み: "12"
return 0;
}
QTextStream::integerBase()
は、QTextStream
が整数を読み書きする際の基数を取得する関数ですが、これ自体が直接エラーを引き起こすことはほとんどありません。しかし、基数の設定(setIntegerBase()
)との関連や、意図しない基数での読み書きが原因で、論理的なエラーや予期しない結果が生じることがよくあります。
ここでは、QTextStream::integerBase()
に関連する一般的なエラーと、そのトラブルシューティングについて説明します。
意図しない基数での読み取り/書き込み
エラー/問題
- 数値をファイルに書き込んだら、期待と異なるフォーマット(例:10進数で書きたかったのに16進数で書かれた)になった。
- ファイルから数値を読み込んだら、期待と異なる値になった。
原因
QTextStream
のデフォルトの基数設定、または以前にsetIntegerBase()
やマニピュレータ(Qt::hex
, Qt::oct
, Qt::dec
)で設定された基数が、現在の操作に適していない場合に発生します。
- 書き込み時
- デフォルトでは
integerBase()
は10
(10進数)を返します。つまり、明示的に変更しない限り、数値は10進数で書き込まれます。 setIntegerBase(16)
などを設定したまま数値を書き込むと、その基数で出力されます(例: 10を16進数で書き込むと "a" となる)。
- デフォルトでは
- 読み取り時
- デフォルトでは
integerBase()
は0
を返します。これは、QTextStream
が0x
(16進数)や0
から始まる(8進数)などのプレフィックスを自動的に検出することを意味します。しかし、プレフィックスがない「10」のような文字列は、デフォルトで10進数として解釈されます。 - もし明示的に
setIntegerBase(16)
などを設定したまま、10進数の文字列を読み込もうとすると、誤った値として解釈されます(例: "10"が16進数として読み込まれ、16になる)。
- デフォルトでは
トラブルシューティング
-
- 入力文字列にプレフィックスがあるか確認する
0x
、0
などのプレフィックスがある場合、デフォルト(integerBase()
が0
)であれば正しく解釈されます。 - setIntegerBase()で基数を明示的に設定する
特定の基数で読み込みたい場合は、setIntegerBase(desiredBase)
を使用します。読み込み後に基数をリセットすることも忘れずに行うと、以降の操作に影響を与えません。 - マニピュレータを使用する
stream >> Qt::hex >> value;
のように、ストリーム操作の際に一時的に基数を変更するマニピュレータが便利です。
- 入力文字列にプレフィックスがあるか確認する
-
書き込み時
- setIntegerBase()で基数を明示的に設定する
特定の基数で出力したい場合は、setIntegerBase(desiredBase)
を使用します。 - マニピュレータを使用する
stream << Qt::hex << value;
のように、マニピュレータを使って一時的に基数を変更します。 - 出力後の基数をリセットする
異なるフォーマットの数値を出力した後、必要であればsetIntegerBase(10)
やQt::dec
で基数を10進数に戻しましょう。
- setIntegerBase()で基数を明示的に設定する
基数の設定忘れによる予期せぬ動作
エラー/問題
- 特定の場所でしか正しく読み書きできない。
- ファイルへの書き込みで、数値のフォーマットが毎回異なる。
原因
QTextStream
の基数設定は、明示的に変更しない限り、そのストリームオブジェクト全体に影響します。一度setIntegerBase()
で基数を変更すると、そのストリームはその後もその基数で数値の読み書きを試みます。リセットし忘れると、予期しない動作につながります。
トラブルシューティング
- 新しいQTextStreamオブジェクトの利用
複数の異なる基数で読み書きを行う場合、それぞれの操作に対して新しいQTextStream
オブジェクトを作成することを検討すると、基数の混同を防ぐことができます。これは、特に異なるファイルやデータソースを扱う場合に有効です。 - スコープを意識した基数設定
特定のブロックや関数内で一時的に基数を変更する場合は、そのブロックの終了時、または操作が完了した後に基数をデフォルトに戻す(setIntegerBase(10)
またはQt::dec
)習慣をつけましょう。
無効な基数の設定
エラー/問題
setIntegerBase()
に0以外の無効な値を設定した際に、動作が不安定になったり、期待通りに動作しなかったりする。
原因
setIntegerBase()
に指定できる基数は、0
(自動検出)、2
(2進数)、8
(8進数)、10
(10進数)、16
(16進数)など、Qtがサポートする有効な範囲の数値である必要があります。無効な値を設定した場合の挙動は保証されません。
トラブルシューティング
setIntegerBase()
を使用する際は、必ずQtがサポートする有効な基数(通常は2から36の間)を使用していることを確認してください。一般的な用途では、0
,2
,8
,10
,16
が使われます。
エラー/問題
- 数値の読み取りに失敗しても、プログラムがそれを検出せずに続行し、誤った値で処理を進めてしまう。
原因
QTextStream
は、数値の読み取りに失敗した場合(例えば、数値ではない文字列を数値として読み込もうとした場合)、ストリームの内部ステータスをエラー状態に設定します。しかし、このステータスをチェックしないと、プログラムはそのエラーに気づかず、0などの初期値で処理を続行してしまう可能性があります。
トラブルシューティング
- 数値を読み込んだ後、
QTextStream::status()
やQTextStream::atEnd()
、またはストリーム自体のブールコンテキスト変換(if (stream >> value)
)を利用して、読み取りが成功したかどうかを確認しましょう。
#include <QTextStream>
#include <QString>
#include <QDebug>
int main() {
QString data = "123 abc 0xFF";
QTextStream stream(&data);
int num1;
stream >> num1; // 123 を読み込む
qDebug() << "Num1:" << num1 << ", Status:" << stream.status();
int num2;
// 数値ではない文字列を読み込もうとする
stream >> num2;
qDebug() << "Num2:" << num2 << ", Status:" << stream.status(); // ReadError が返されるはず
// ストリームがエラー状態になると、それ以降の読み取りは失敗する可能性が高い
int num3;
stream >> Qt::hex >> num3;
qDebug() << "Num3:" << num3 << ", Status:" << stream.status(); // やはりエラー状態
// エラー状態をリセットする
stream.setStatus(QTextStream::Ok);
qDebug() << "Status reset. New status:" << stream.status();
// 再度読み込むと、今度は成功する
stream >> Qt::hex >> num3; // "0xFF" を読み込む
qDebug() << "Num3 (after reset):" << num3 << ", Status:" << stream.status();
return 0;
}
QTextStream::integerBase()
は、現在の基数を確認するための便利な関数ですが、その設定(setIntegerBase()
)や、ストリーム全体への影響、そしてエラーハンドリングが重要です。数値の読み書きで予期せぬ結果が出た場合は、以下の点を順に確認してください。
- 現在の
integerBase()
が意図する基数になっているか? - 過去の
setIntegerBase()
またはマニピュレータが影響を与えていないか? - 入力データに適切なプレフィックスが付いているか、または基数が明示的に設定されているか?
- 数値の読み取り後に、
QTextStream
のステータスを確認しているか?
QtにおけるQTextStream::integerBase()
に関連するプログラミング例をいくつかご紹介します。この関数自体は基数を取得するだけですが、通常は基数を設定するsetIntegerBase()
や、一時的に基数を変更するマニピュレータ(Qt::hex
, Qt::oct
, Qt::dec
)と組み合わせて使用されます。
例1: 現在の基数の確認とデフォルトの動作
この例では、QTextStream
のデフォルトのintegerBase()
が読み取り時と書き込み時でどのように異なるかを示します。
#include <QTextStream>
#include <QString>
#include <QDebug> // qDebug() のために必要
int main() {
// -----------------
// 読み取り時の動作
// -----------------
QString readData = "123 0xFF 010"; // 10進数, 16進数, 8進数
QTextStream inStream(&readData, QIODevice::ReadOnly);
qDebug() << "--- 読み取り時の例 ---";
qDebug() << "読み取りストリームのデフォルトのintegerBase():" << inStream.integerBase();
// デフォルトは0。これは、QTextStreamがプレフィックスを自動検出することを示す。
int val1, val2, val3;
inStream >> val1; // 123 (10進数)
qDebug() << "読み取り値 (10進数):" << val1;
inStream >> val2; // 0xFF (16進数) -> 255
qDebug() << "読み取り値 (16進数):" << val2;
inStream >> val3; // 010 (8進数) -> 8
qDebug() << "読み取り値 (8進数):" << val3;
qDebug() << "\n";
// -----------------
// 書き込み時の動作
// -----------------
QString writeData;
QTextStream outStream(&writeData, QIODevice::WriteOnly);
qDebug() << "--- 書き込み時の例 ---";
qDebug() << "書き込みストリームのデフォルトのintegerBase():" << outStream.integerBase();
// デフォルトは10。これは、QTextStreamがデフォルトで10進数で書き込むことを示す。
outStream << 100 << " "; // 100 (10進数)
outStream << 255; // 255 (10進数)
qDebug() << "デフォルト設定での書き込み結果:" << writeData; // "100 255"
return 0;
}
出力例
--- 読み取り時の例 ---
読み取りストリームのデフォルトのintegerBase(): 0
読み取り値 (10進数): 123
読み取り値 (16進数): 255
読み取り値 (8進数): 8
--- 書き込み時の例 ---
書き込みストリームのデフォルトのintegerBase(): 10
デフォルト設定での書き込み結果: "100 255"
例2: setIntegerBase()
による基数の変更とintegerBase()
による確認
この例では、setIntegerBase()
を使って明示的に基数を設定し、integerBase()
でその設定が反映されていることを確認します。
#include <QTextStream>
#include <QString>
#include <QDebug>
int main() {
QString data;
QTextStream stream(&data, QIODevice::ReadWrite);
qDebug() << "初期のintegerBase():" << stream.integerBase(); // デフォルトは10 (書き込みモードのため)
// 基数を16進数に設定
stream.setIntegerBase(16);
qDebug() << "16進数に設定後のintegerBase():" << stream.integerBase();
stream << 255; // 16進数で書き込む -> "ff"
qDebug() << "16進数で書き込んだ結果:" << data; // "ff"
// ストリームの内容をクリア
data.clear();
stream.seek(0); // ストリーム位置を先頭に戻す
// 基数を8進数に設定
stream.setIntegerBase(8);
qDebug() << "8進数に設定後のintegerBase():" << stream.integerBase();
stream << 10; // 8進数で書き込む (10進数の10は8進数で12)
qDebug() << "8進数で書き込んだ結果:" << data; // "12"
// ストリームの内容をクリア
data.clear();
stream.seek(0);
// 読み取りのために基数を0 (自動検出) に設定
stream.setIntegerBase(0);
qDebug() << "自動検出に設定後のintegerBase():" << stream.integerBase();
// 読み取りテスト(ここでは書き込みはしないので、前のデータが残っていると想定)
// 通常は読み込むデータをセットするが、ここでは例示のために書き込みはしない
QString readInput = "100 0xFF 010"; // 10進数, 16進数, 8進数
QTextStream readStream(&readInput, QIODevice::ReadOnly);
readStream.setIntegerBase(0); // 読み取りストリームでも明示的に設定
qDebug() << "読み取りストリームのintegerBase() (0に設定):" << readStream.integerBase();
int val;
readStream >> val;
qDebug() << "読み取り1 (100):" << val; // 100
readStream >> val;
qDebug() << "読み取り2 (0xFF):" << val; // 255
readStream >> val;
qDebug() << "読み取り3 (010):" << val; // 8
return 0;
}
出力例
初期のintegerBase(): 10
16進数に設定後のintegerBase(): 16
16進数で書き込んだ結果: "ff"
8進数に設定後のintegerBase(): 8
8進数で書き込んだ結果: "12"
自動検出に設定後のintegerBase(): 0
読み取りストリームのintegerBase() (0に設定): 0
読み取り1 (100): 100
読み取り2 (0xFF): 255
読み取り3 (010): 8
Qt::hex
, Qt::oct
, Qt::dec
といったマニピュレータを使用すると、setIntegerBase()
を呼び出すことなく、一時的に基数を変更できます。この方法は、特定の出力や入力に対してのみ基数を変更したい場合に非常に便利です。
#include <QTextStream>
#include <QString>
#include <QDebug>
int main() {
QString data;
QTextStream stream(&data, QIODevice::ReadWrite);
qDebug() << "現在のintegerBase():" << stream.integerBase(); // デフォルトは10
// 10進数で書き込む
stream << "Decimal: " << 100 << "\n";
qDebug() << "書き込み後 (10進数):" << data;
// 16進数で書き込む (マニピュレータを使用)
// stream の integerBase() はこの操作の後も10のまま
stream << "Hex: " << Qt::hex << 255 << "\n";
qDebug() << "書き込み後 (16進数):" << data;
qDebug() << "マニピュレータ使用後のintegerBase():" << stream.integerBase(); // 依然として10
// 8進数で書き込む (マニピュレータを使用)
stream << "Octal: " << Qt::oct << 10 << "\n"; // 10進数の10は8進数で12
qDebug() << "書き込み後 (8進数):" << data;
qDebug() << "マニピュレータ使用後のintegerBase():" << stream.integerBase(); // 依然として10
// 10進数に戻す (明示的に)
stream << "Back to Decimal: " << Qt::dec << 10 << "\n";
qDebug() << "書き込み後 (10進数に戻す):" << data;
qDebug() << "\n--- 読み取りの例 ---";
QString readInput = "100 aa 12"; // 100(10進), aa(16進), 12(8進)
QTextStream readStream(&readInput, QIODevice::ReadOnly);
int val;
readStream >> val; // 100 (10進数として読む)
qDebug() << "読み取り1 (10進):" << val;
// 次の値を16進数として読む
readStream >> Qt::hex >> val; // "aa"を16進数として読む -> 170
qDebug() << "読み取り2 (16進):" << val;
// 次の値を8進数として読む
readStream >> Qt::oct >> val; // "12"を8進数として読む -> 10
qDebug() << "読み取り3 (8進):" << val;
return 0;
}
現在のintegerBase(): 10
書き込み後 (10進数): "Decimal: 100
"
書き込み後 (16進数): "Decimal: 100
Hex: ff
"
マニピュレータ使用後のintegerBase(): 10
書き込み後 (8進数): "Decimal: 100
Hex: ff
Octal: 12
"
マニピュレータ使用後のintegerBase(): 10
書き込み後 (10進数に戻す): "Decimal: 100
Hex: ff
Octal: 12
Back to Decimal: 10
"
--- 読み取りの例 ---
読み取り1 (10進): 100
読み取り2 (16進): 170
読み取り3 (8進): 10
QTextStream::integerBase()
は、QTextStream
が整数を読み書きする際の現在の基数(進数)を取得するための関数です。これ自体に「代替方法」があるというよりは、「QTextStreamを使わずに、文字列と数値の間で基数を指定して変換する方法」、あるいは**「QTextStreamの基数設定をより効果的に管理する方法」**を代替手段として考えることができます。
以下に、QTextStream
の基数設定に代わる、または補完するプログラミング方法をいくつか説明します。
QStringの静的メソッド QString::number() (数値から文字列への変換)
QString::number()
は、指定された数値を任意の基数(2進数から36進数まで)の文字列に変換するのに非常に便利です。QTextStream
の書き込み時の基数設定の代替として使えます。
#include <QString>
#include <QDebug>
int main() {
int value = 255;
// 10進数に変換 (デフォルト)
QString s1 = QString::number(value);
qDebug() << "10進数:" << s1; // "255"
// 16進数に変換
QString s2 = QString::number(value, 16);
qDebug() << "16進数:" << s2; // "ff"
// 8進数に変換
QString s3 = QString::number(value, 8);
qDebug() << "8進数:" << s3; // "377"
// 2進数に変換
QString s4 = QString::number(value, 2);
qDebug() << "2進数:" << s4; // "11111111"
// 大文字の16進数
// QString::number()には直接大文字にするオプションはないため、toUpperCase() を使う
QString s5 = QString::number(value, 16).toUpper();
qDebug() << "16進数 (大文字):" << s5; // "FF"
return 0;
}
QStringのメンバーメソッド QString::toInt(), toLong(), toULong(), etc. (文字列から数値への変換)
QString
クラスには、文字列を数値に変換するための便利なメソッドが用意されており、変換元の文字列の基数を指定できます。QTextStream
の読み取り時の基数設定の代替として使えます。変換が成功したかどうかをチェックするためのbool *ok
パラメータも利用できます。
#include <QString>
#include <QDebug>
int main() {
QString hexString = "FF";
QString octString = "12";
QString decString = "100";
QString binaryString = "1011";
QString prefixedHexString = "0xFF"; // QTextStreamは自動検出するが、toInt()では明示的
bool ok;
int value;
// 16進数として変換
value = hexString.toInt(&ok, 16);
qDebug() << "FF (16進数) ->" << value << "(OK:" << ok << ")"; // 255
// 8進数として変換
value = octString.toInt(&ok, 8);
qDebug() << "12 (8進数) ->" << value << "(OK:" << ok << ")"; // 10
// 10進数として変換
value = decString.toInt(&ok, 10);
qDebug() << "100 (10進数) ->" << value << "(OK:" << ok << ")"; // 100
// 2進数として変換
value = binaryString.toInt(&ok, 2);
qDebug() << "1011 (2進数) ->" << value << "(OK:" << ok << ")"; // 11
// プレフィックス付きの16進数文字列 (toInt()はプレフィックスを無視するため、基数を明示)
value = prefixedHexString.toInt(&ok, 16);
qDebug() << "0xFF (16進数) ->" << value << "(OK:" << ok << ")"; // 255
// 変換失敗の例 (不正な基数、または文字列が対応する基数ではない)
QString invalidString = "XYZ";
value = invalidString.toInt(&ok, 10);
qDebug() << "XYZ (10進数) ->" << value << "(OK:" << ok << ")"; // 0 (OK:false)
value = decString.toInt(&ok, 16); // 100を16進数として解釈しようとすると失敗
qDebug() << "100 (16進数) ->" << value << "(OK:" << ok << ")"; // 256 (OK:true) - これは意外な結果になりがち。
// "100"は16進数として有効なため、256になる。
// 意図しない変換を防ぐには、文字列の内容をよく理解する必要がある。
return 0;
}
QString::toInt()の注意点
- 文字列が指定された基数で有効な数字を含んでいれば、部分的な変換ではなく、全体をその基数として解釈しようとします。例えば、"100"を
toInt(&ok, 16)
で変換すると、10進数の256になります。 QTextStream
が0x
や0
といったプレフィックスを自動検出するのに対し、QString::toInt()
はプレフィックスを無視して、指定された基数で文字列を解析します。そのため、0xFF
を16進数として読み込むには、toInt(&ok, 16)
のように明示的に基数を指定する必要があります。
QString::arg() (書式付き文字列の生成)
QString::arg()
メソッドは、C言語のprintf
に似た書式設定機能を提供します。数値の書式を制御する際にも基数を指定できます。これはQTextStream
の書き込みフォーマットを細かく制御したい場合の代替になります。
#include <QString>
#include <QDebug>
int main() {
int value = 255;
// 10進数
QString s1 = QString("Value: %1").arg(value);
qDebug() << s1; // "Value: 255"
// 16進数 (フィールド幅0, 基数16, パディング文字スペース)
QString s2 = QString("Value: %1").arg(value, 0, 16);
qDebug() << s2; // "Value: ff"
// 16進数 (フィールド幅4, パディング文字'0', 大文字)
QString s3 = QString("Value: %1").arg(value, 4, 16, QChar('0')).toUpper();
qDebug() << s3; // "Value: 00FF"
// 8進数
QString s4 = QString("Value: %1").arg(value, 0, 8);
qDebug() << s4; // "Value: 377"
// 2進数
QString s5 = QString("Value: %1").arg(value, 0, 2);
qDebug() << s5; // "Value: 11111111"
return 0;
}
Qtに依存しない標準C++の機能を使いたい場合、std::stringstream
を利用することも可能です。std::hex
, std::oct
, std::dec
といったマニピュレータを使って基数を制御します。
#include <iostream>
#include <sstream> // std::stringstream のために必要
#include <string>
int main() {
// -----------------
// 数値から文字列への変換
// -----------------
int value = 255;
std::stringstream ss_out;
ss_out << std::dec << value; // 10進数
std::cout << "Decimal: " << ss_out.str() << std::endl; // "255"
ss_out.str(""); // クリア
ss_out.clear(); // フラグをクリア
ss_out << std::hex << value; // 16進数
std::cout << "Hexadecimal: " << ss_out.str() << std::endl; // "ff"
ss_out.str("");
ss_out.clear();
ss_out << std::oct << value; // 8進数
std::cout << "Octal: " << ss_out.str() << std::endl; // "377"
ss_out.str("");
ss_out.clear();
// -----------------
// 文字列から数値への変換
// -----------------
std::string hexStr = "ff";
std::string octStr = "12";
std::string decStr = "100";
std::string prefixedHex = "0xff"; // std::stringstream もプレフィックスを自動検出
std::stringstream ss_in;
int readVal;
ss_in.str(hexStr);
ss_in >> std::hex >> readVal;
std::cout << "Read hex 'ff': " << readVal << std::endl; // 255
ss_in.str("");
ss_in.clear();
ss_in.str(octStr);
ss_in >> std::oct >> readVal;
std::cout << "Read oct '12': " << readVal << std::endl; // 10
ss_in.str("");
ss_in.clear();
ss_in.str(decStr);
ss_in >> std::dec >> readVal;
std::cout << "Read dec '100': " << readVal << std::endl; // 100
ss_in.str("");
ss_in.clear();
ss_in.str(prefixedHex); // プレフィックス付きの16進数
ss_in >> readVal; // デフォルトの10進数から読み込み開始。プレフィックスを検出
std::cout << "Read prefixed hex '0xff': " << readVal << std::endl; // 255
return 0;
}
QTextStream::integerBase()
は、QTextStream
オブジェクトが現在どのような基数で整数を扱っているかを知るために使われますが、直接的な変換操作を行うものではありません。
代替方法として提示したのは、以下のケースです。
- Qtに依存しない汎用的なストリーム処理
std::stringstream
(C++標準ライブラリ) - 書式付き文字列の生成
QString::arg()
- 単一の数値と文字列の変換
- 数値から文字列へ:
QString::number(value, base)
- 文字列から数値へ:
QString::toInt(&ok, base)
など
- 数値から文字列へ: