17

出于调试目的,我经常将指针值(大部分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)

4

5 回答 5

22

使用QString::arg()

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 个十六进制数字)。

于 2013-05-15T15:05:10.847 回答
14

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

QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
于 2012-01-16T16:34:53.067 回答
7

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转换)

于 2012-08-03T03:49:58.170 回答
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());
}
于 2012-01-16T15:44:30.460 回答
1

对我来说,大多数情况下,看看指针是否是nullptr或者它是否与其他指针具有相同的值就足够了。对于这些情况,将指针转换为数字然后使用就足够了QString::number()

Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;
于 2017-11-09T09:17:52.863 回答