ポインター値を QString に変換するにはどうすればよいですか?
質問
デバッグ目的で、ポインター値を出力することがよくあります (ほとんどの場合、 this
) から qDebug:
qDebug("pointer of current object = 0x%08x",this);
, 、「%08x」を書式文字列として使用し、単純に渡します。 this
パラメータとして。
ポインター値を QString に変換するにはどうすればよいですか?
これまでに私が得たものは次のとおりです。
char p = (char)this;
return QString("0x%1").arg(p, 8, '0');
しかし、コンパイラはその値をどう扱うべきか理解していないようです。にキャストしています char
この場合は正しいでしょうか?あるいは、これを行うためのより安全な方法は何でしょうか?
Qt 4.7.4 で Visual C++ を使用する。
編集
使用する qulonglong
提案どおり
qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');
コンパイラ エラー メッセージが表示される (エラー C2666).
解決
使用する QString::arg():
MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr,
QT_POINTER_SIZE * 2, 16, QChar('0'));
ポインターには正しい型とサイズが使用されます (quintptr
そして QT_POINTER_SIZE
)、常に接頭辞が付きます "0x"
.
ノート:
値の先頭にゼロを付けるには、4 番目のパラメータを次のようにする必要があります。 QChar('0')
.
正しい桁数を出力するには、 QT_POINTER_SIZE
2 倍にする必要があります (各バイトには 2 つの 16 進数が必要なため)。
他のヒント
なぜ単に使用しないのですか QString & QString::sprintf ( const char * cformat, ... )
QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
QTextStream あなたが求めている機能を提供しているようで、単純に動作します。 void*
.
const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;
他のアプローチとは異なり、特定の数値「8」や「qlonglong」へのキャストなどの概念は参照しません。それほど心配はないようで、次のようなものです。 std::string の所定のメソッド (取得しなくても std::string
変換が含まれます)
次の中間ステップを実行できます sprintf
:
QString pointer_to_qstring(void *ptr)
{
char temp[16];
sprintf(temp, "0x%08p", ptr);
return QString(static_cast<char *>(temp));
}
または ostringstream
:
QString pointer_to_qstring(void *ptr)
{
std::ostringstream oss;
oss << std::setw(8) << std::setfill('0') << std::hex << ptr:
return QString(oss.str().c_str());
}
私にとっては、ほとんどの場合、ポインターが nullptr
または、他のポインタと同じ値を持つかどうか。このような場合には、ポインタを数値に変換してから使用するだけで十分です。 QString::number()
Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;