¿Cómo convertir un valor de puntero a QString?
Pregunta
para fines de depuración, a menudo genero valores de puntero (principalmente this
) para qDepurar:
qDebug("pointer of current object = 0x%08x",this);
, usando "%08x" como cadena de formato y simplemente pasando this
como parámetro.
¿Cómo puedo convertir el valor del puntero a QString?
Esto es lo que obtuve hasta ahora:
char p = (char)this;
return QString("0x%1").arg(p, 8, '0');
Pero el compilador no parece saber qué hacer con ese valor.está lanzando a char
correcto en este caso?¿O cuál sería una forma más segura de hacer esto?
Usando Visual C++ con Qt 4.7.4.
EDITAR
Usando qulonglong
como se sugiere
qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');
produce en un mensaje de error del compilador (error C2666).
Solución
usando qstring :: arg () :
MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr,
QT_POINTER_SIZE * 2, 16, QChar('0'));
Utilizará el tipo y tamaño correctos para los punteros (quintptr
y QT_POINTER_SIZE
) y siempre preferirá el prefijo "0x"
.
Notas:
Para prefijar el valor con ceros, el cuarto parámetro debe ser QChar('0')
.
Para emitir el número correcto de dígitos, debe duplicarse QT_POINTER_SIZE
(porque cada byte necesita 2 dígitos hexagonales).
Otros consejos
¿Por qué no utilizar simplemente QString & QString::sprintf ( const char * cformat, ... )
QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
QTextStream parece ofrecer la funcionalidad que busca y funciona simplemente en un void*
.
const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;
A diferencia de otros enfoques, no hace referencia a nociones como el número particular "8" o la conversión a "qlonglong".Parece menos preocupante y se parece mucho a la método prescrito para std::string (aunque sin conseguir std::string
conversiones involucradas)
Puede hacer un paso intermedio con sprintf
:
QString pointer_to_qstring(void *ptr)
{
char temp[16];
sprintf(temp, "0x%08p", ptr);
return QString(static_cast<char *>(temp));
}
O a través de 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 mí sobre todo es suficiente con ver si el puntero es el nullptr
o si tiene el mismo valor que otro puntero.Para esos casos es suficiente convertir el puntero a un número y luego usar QString::number()
Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;