Come convertire un valore del puntatore in QString?
Domanda
per scopi di debug, spesso restituisco valori di puntatore (principalmente this
) a qDebug:
qDebug("pointer of current object = 0x%08x",this);
, utilizzando "% 08x" come stringa di formato e semplicemente passando this
come parametro.
Come posso convertire il valore del puntatore in una QString?
Questo è quello che ho ottenuto finora:
char p = (char)this;
return QString("0x%1").arg(p, 8, '0');
Ma il compilatore non sembra capire cosa fare con quel valore.La trasmissione a char
è corretta in questo caso?O quale sarebbe un modo più sicuro per farlo?
Utilizzo di Visual C ++ con Qt 4.7.4.
<”EDIT
Utilizzo di qulonglong
come suggerito
qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');
restituisce un messaggio di errore del compilatore (erroreC2666) .
Soluzione
Utilizzo di QString :: arg () :
MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr,
QT_POINTER_SIZE * 2, 16, QChar('0'));
Utilizzerà il tipo e la dimensione corretti per i puntatori (quintptr
e QT_POINTER_SIZE
) e avrà sempre il prefisso "0x"
.
Note:
Per anteporre al valore degli zeri, il quarto parametro deve essere QChar('0')
.
Per visualizzare il numero corretto di cifre, QT_POINTER_SIZE
deve essere raddoppiato (poiché ogni byte necessita di 2 cifre esadecimali).
Altri suggerimenti
Perché non utilizzare semplicemente QString & QString::sprintf ( const char * cformat, ... )
QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
QTextStream sembra offrire la funzionalità che cerchi e funzionasemplicemente su un void*
.
const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;
A differenza degli altri approcci, non fa riferimento a nozioni come il numero particolare "8" o il casting a "qlonglong".Sembra meno preoccupante ed è molto simile al metodo prescritto per std :: string (sebbene senza coinvolgere conversioni std::string
)
Potresti eseguire un passaggio intermedio con sprintf
:
QString pointer_to_qstring(void *ptr)
{
char temp[16];
sprintf(temp, "0x%08p", ptr);
return QString(static_cast<char *>(temp));
}
O tramite 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());
}
Per me principalmente è sufficiente vedere se il puntatore è il nullptr
o se ha lo stesso valore di un altro puntatore.In questi casi è sufficiente convertire il puntatore in un numero e quindi utilizzare QString::number()
Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;