Wie konvertiere ich einen Zeigerwert in QString?
Frage
Zu Debugzwecken gebe ich oft Zeigerwerte aus (meistens this
) zu qDebug:
qDebug("pointer of current object = 0x%08x",this);
, indem Sie „%08x“ als Formatzeichenfolge verwenden und einfach übergeben this
als Parameter.
Wie kann ich den Zeigerwert in einen QString konvertieren?
Das habe ich bisher bekommen:
char p = (char)this;
return QString("0x%1").arg(p, 8, '0');
Aber der Compiler scheint nicht herauszufinden, was er mit diesem Wert anfangen soll.Wirft nach char
in diesem Fall richtig?Oder was wäre ein sichererer Weg, dies zu tun?
Verwendung von Visual C++ mit Qt 4.7.4.
BEARBEITEN
Benutzen qulonglong
wie vorgeschlagen
qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');
führt zu einer Compiler-Fehlermeldung (Fehler C2666).
Lösung
Verwenden von QString :: arg () :
MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr,
QT_POINTER_SIZE * 2, 16, QChar('0'));
Es wird der richtige Typ und die richtige Größe für Zeiger (quintptr
und QT_POINTER_SIZE
) verwendet und immer "0x"
vorangestellt.
Hinweise:
Um dem Wert Nullen voranzustellen, muss der vierte Parameter QChar('0')
sein.
Um die richtige Anzahl von Ziffern auszugeben, muss der QT_POINTER_SIZE
verdoppelt werden (da jedes Byte 2 hexadezimale Ziffern benötigt).
Andere Tipps
Warum nicht einfach QString & QString::sprintf ( const char * cformat, ... )
verwenden?
QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
QTextStream scheint die von Ihnen gesuchte Funktionalität zu bieten und funktionierteinfach auf einem void*
.
const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;
Im Gegensatz zu den anderen Ansätzen bezieht es sich nicht auf Begriffe wie die bestimmte Zahl "8" oder das Casting auf "qlonglong".Scheint weniger besorgniserregend und ähnelt der vorgeschriebenen Methode für std :: string (allerdings ohne std::string
-Konvertierungen)
Mit sprintf
können Sie einen Zwischenschritt ausführen:
QString pointer_to_qstring(void *ptr)
{
char temp[16];
sprintf(temp, "0x%08p", ptr);
return QString(static_cast<char *>(temp));
}
Oder über 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());
}
Für mich reicht es meistens aus zu sehen, ob der Zeiger der nullptr
or ist, wenn er den gleichen Wert wie ein anderer Zeiger hat.In diesen Fällen reicht es aus, den Zeiger in eine Zahl umzuwandeln und dann den QString::number()
zu verwenden
Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;