如何将指针值转换为QString?

时间:2012-01-16 15:10:31

标签: c++ qt pointers 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');

在编译器错误消息(error C2666)中产生。

5 个答案:

答案 0 :(得分:15)

另一种解决方案:

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

它将使用正确的指针大小和类型(quintptrQT_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));;