質問

デバッグ目的で、ポインター値を出力することがよくあります (ほとんどの場合、 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));;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top