Как преобразовать значение указателя в QString? - PullRequest
14 голосов
/ 16 января 2012

в целях отладки Я часто выводю значения указателя (в основном 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.

EDIT

Использование qulonglong как предложено

qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');

приводит к сообщению об ошибке компилятора (ошибка C2666) .

Ответы [ 5 ]

17 голосов
/ 15 мая 2013

Использование 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 должно быть удвоено (потому что каждому байту нужны 2 шестнадцатеричные цифры).

13 голосов
/ 16 января 2012

Почему бы просто не использовать QString & QString::sprintf ( const char * cformat, ... )

QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
4 голосов
/ 03 августа 2012

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 преобразований)

2 голосов
/ 16 января 2012

Вы можете сделать промежуточный шаг с помощью 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());
}
0 голосов
/ 09 ноября 2017

Для меня в основном достаточно посмотреть, является ли указатель nullptr или имеет ли он то же значение, что и другой указатель.Для этих случаев достаточно преобразовать указатель в число, а затем использовать QString::number()

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