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).

¿Fue útil?

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 nullptro 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));;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top