كيفية تحويل قيمة المؤشر إلى QString؟
سؤال
لأغراض تصحيح الأخطاء، غالبًا ما أقوم بإخراج قيم المؤشر (في الغالب this
) إلى qDebug:
qDebug("pointer of current object = 0x%08x",this);
, ، باستخدام "%08x" كسلسلة تنسيق وتمريرها ببساطة this
كمعلمة.
كيف يمكنني تحويل قيمة المؤشر إلى QString؟
وهذا ما حصلت عليه حتى الآن:
char p = (char)this;
return QString("0x%1").arg(p, 8, '0');
ولكن يبدو أن المترجم لا يعرف ما يجب فعله بهذه القيمة.يتم الصب ل char
الصحيح في هذه الحالة؟أو ما هي الطريقة الأكثر أمانًا للقيام بذلك؟
استخدام Visual C++ مع Qt 4.7.4.
يحرر
استخدام qulonglong
كما هو مقترح
qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');
ينتج في رسالة خطأ مترجم (خطأ C2666).
المحلول
استخدام QString::arg():
MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr,
QT_POINTER_SIZE * 2, 16, QChar('0'));
سيستخدم النوع والحجم الصحيحين للمؤشرات (quintptr
و QT_POINTER_SIZE
) وسوف تكون البادئة دائمًا "0x"
.
ملحوظات:
لبادئة القيمة بالأصفار، يجب أن تكون المعلمة الرابعة QChar('0')
.
لإخراج العدد الصحيح من الأرقام، QT_POINTER_SIZE
يحتاج إلى المضاعفة (لأن كل بايت يحتاج إلى رقمين سداسي عشري).
نصائح أخرى
لماذا لا تستخدم ببساطة QString & QString::sprintf ( const char * cformat, ... )
QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
QTextStream يبدو أنه يقدم الوظيفة التي تبحث عنها، ويعمل ببساطة على void*
.
const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;
على عكس الأساليب الأخرى، فإنه لا يشير إلى مفاهيم مثل الرقم المحدد "8" أو التحويل إلى "qlonglong".يبدو أقل إثارة للقلق، ويشبه إلى حد كبير الطريقة الموصوفة لـ std::string (على الرغم من دون الحصول على std::string
التحويلات المعنية)
يمكنك القيام بخطوة وسيطة مع sprintf
:
QString pointer_to_qstring(void *ptr)
{
char temp[16];
sprintf(temp, "0x%08p", ptr);
return QString(static_cast<char *>(temp));
}
أو من خلال 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());
}
بالنسبة لي في الغالب يكفي معرفة ما إذا كان المؤشر هو nullptr
أو إذا كان له نفس قيمة مؤشر آخر.في تلك الحالات يكفي تحويل المؤشر إلى رقم ثم استخدامه QString::number()
Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;