Como converter um valor de ponteiro em QString?
Pergunta
para fins de depuração, geralmente produzo valores de ponteiro (principalmente this
) para qDebug:
qDebug("pointer of current object = 0x%08x",this);
, usando "%08x" como string de formato e simplesmente passando this
como parâmetro.
Como posso converter o valor do ponteiro em um QString?
Isso é o que consegui até agora:
char p = (char)this;
return QString("0x%1").arg(p, 8, '0');
Mas o compilador parece não descobrir o que fazer com esse valor.Está lançando para char
correto neste caso?Ou qual seria uma maneira mais segura de fazer isso?
Usando Visual C++ com Qt 4.7.4.
EDITAR
Usando qulonglong
como sugerido
qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');
produz uma mensagem de erro do compilador (erro C2666).
Solução
Usando QString :: arg () :
MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr,
QT_POINTER_SIZE * 2, 16, QChar('0'));
Ele usará o tipo e o tamanho corretos para os ponteiros (quintptr
e QT_POINTER_SIZE
) e sempre prefixará "0x"
.
Observações:
Para prefixar o valor com zeros, o quarto parâmetro precisa ser QChar('0')
.
Para gerar o número correto de dígitos, QT_POINTER_SIZE
precisa ser duplicado (porque cada byte precisa de 2 dígitos hexadecimais).
Outras dicas
Por que não simplesmente usar QString & QString::sprintf ( const char * cformat, ... )
QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
QTextStream parece oferecer a funcionalidade que você procura e operasimplesmente em um void*
.
const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;
Ao contrário das outras abordagens, não faz referência a noções como o número particular "8" ou a conversão para "qlonglong".Parece menos preocupante e é muito parecido com o método prescrito para std :: string (embora sem envolver conversões std::string
)
Você poderia fazer uma etapa intermediária com sprintf
:
QString pointer_to_qstring(void *ptr)
{
char temp[16];
sprintf(temp, "0x%08p", ptr);
return QString(static_cast<char *>(temp));
}
Ou através do 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());
}
Para mim, principalmente, é o suficiente para ver se o ponteiro é o nullptr
ou se tem o mesmo valor de um outro ponteiro.Para esses casos, é suficiente converter o ponteiro em um número e, em seguida, usar QString::number()
Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;