Как преобразовать значение указателя в 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 С++ с Qt 4.7.4.

ИЗМЕНИТЬ

Используя qulonglong как предложено

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

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

Ответ 1

Другое решение:

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

Он будет использовать правильный размер и тип для указателей (quintptr и QT_POINTER_SIZE) и всегда будет префикс "0x"

Edit:

Чтобы префикс значения с нулями, четвертый параметр должен быть "QChar ('0')". Чтобы вывести правильное количество цифр, QT_POINTER_SIZE необходимо удвоить (поскольку каждый байт нуждается в двух шестнадцатеричных цифрах).

Ответ 2

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

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

Ответ 3

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)

Ответ 4

Вы можете сделать промежуточный шаг с 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());
}

Ответ 5

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

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