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

Foi útil?

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 nullptrou 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));;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top