出于调试目的,我经常将指针值(大多数是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');
在编译器错误消息(error C2666)中产生。
答案 0 :(得分:15)
另一种解决方案:
MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr,
QT_POINTER_SIZE * 2, 16, QChar('0'));
它将使用正确的指针大小和类型(quintptr
和QT_POINTER_SIZE
),并始终为"0x"
前缀
修改强>
要使用零作为前缀,第四个参数必须是'QChar('0')'。要输出正确的位数,QT_POINTER_SIZE
需要加倍(因为每个字节需要2个十六进制数字)。
答案 1 :(得分:12)
为什么不简单地使用QString & QString::sprintf ( const char * cformat, ... )
QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
答案 2 :(得分:4)
QTextStream似乎提供了您所寻求的功能,并且仅在void*
上运行。
const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;
与其他方法不同,它没有引用特定数字“8”或铸造为“qlonglong”等概念。似乎不那么令人担忧,而且非常像prescribed method for std::string (虽然没有涉及std::string
次转化)
答案 3 :(得分:2)
您可以使用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());
}
答案 4 :(得分:0)
对我来说,主要是看指针是nullptr
还是与其他指针的值相同就足够了。对于这些情况,将指针转换为数字就足够了,然后使用QString::number()
Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;