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

È stato utile?

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));;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top