c++ 如何将指针值转换为QString?

fjaof16o  于 2022-12-01  发布在  其他
关注(0)|答案(5)|浏览(412)

出于调试目的,我经常将指针值(大多数为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');

产生编译器错误消息(error C2666)

doinxwow

doinxwow1#

使用QString::arg():

MyClass *ptr = new MyClass();
QString ptrStr = QString( "0x%1" ).arg( reinterpret_cast<quintptr>(ptr), 
                    QT_POINTER_SIZE * 2, 16, QChar('0') );

它将对指针(quintptrQT_POINTER_SIZE)使用正确的类型和大小,并始终使用前缀"0x"

备注:

若要在值前面加上零,第四个参数必须是QChar('0')
要输出正确的位数,QT_POINTER_SIZE需要加倍(因为每个字节需要2个十六进制位)。

vxqlmq5t

vxqlmq5t2#

为什么不直接使用QString & QString::sprintf ( const char * cformat, ... )

QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
bfnvny8b

bfnvny8b3#

QTextStream似乎提供了您所寻求的功能,并且可以在void*上简单地运行。

const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;

与其他方法不同的是,它没有引用特定数字“8”或强制转换为“qlonglong”之类的概念,看起来不那么令人担心,而且很像prescribed method for std::string(尽管没有涉及std::string转换)

wnvonmuf

wnvonmuf4#

您可以使用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());
}
oknwwptz

oknwwptz5#

对我来说,主要是看指针是nullptr还是与其他指针具有相同的值就足够了。

Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;

相关问题