如何将指针值转换为QString?

Mar*_*ngs 14 c++ qstring qt pointers

出于调试目的,我经常将指针值(大多数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');
Run Code Online (Sandbox Code Playgroud)

但编译器似乎并没有弄清楚如何处理该值.char在这种情况下铸造是否正确?或者更安全的方法是什么?

使用Visual C++和Qt 4.7.4.

编辑

qulonglong按建议使用

qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');
Run Code Online (Sandbox Code Playgroud)

产生编译器错误消息(错误C2666).

Ign*_*tor 17

另一种方案:

MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr, 
                    QT_POINTER_SIZE * 2, 16, QChar('0'));
Run Code Online (Sandbox Code Playgroud)

它将使用指针(quintptrQT_POINTER_SIZE)的正确大小和类型,并始终使用前缀"0x"

编辑:

要使用零作为前缀,第四个参数必须是'QChar('0')'.要输出正确的位数,QChar('0')需要加倍(因为每个字节需要2个十六进制数字).

  • 使用quintptr代替? (2认同)
  • @Ignitor:将指针转换为整数类型确实需要`reinterpret_cast`. (2认同)

Kam*_*mek 13

为什么不简单地使用 QString & QString::sprintf ( const char * cformat, ... )

QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
Run Code Online (Sandbox Code Playgroud)

  • 实际上,`QString().sprintf("%08p",ptr)`似乎是最简单的方法.格式`p`本身创建'0x'. (5认同)
  • Qt 5 建议[不要在新的 Qt 代码中使用 `QString::sprintf()` 和 `QString::asprintf()`](http://doc.qt.io/qt-5/qstring.html#asprintf) 。 (2认同)

Hos*_*ork 7

QTextStream似乎提供了您所寻求的功能,并且只需在void*.

const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;
Run Code Online (Sandbox Code Playgroud)

与其他方法不同,它不引用特定数字“8”或强制转换为“qlonglong”等概念。似乎不那么令人担忧,并且很像std::string规定方法(尽管不涉及std::string转换)