重载qdebug只能输出十六进制地址
时间: 2023-07-09 18:24:07 浏览: 127
重载QDebug的输出操作符可以输出任何类型的值,而不仅仅是地址。下面是一个例子:
```
#include <QDebug>
struct Point {
int x;
int y;
};
QDebug operator<<(QDebug debug, const Point& point) {
QDebugStateSaver saver(debug);
debug.nospace() << "Point(" << point.x << ", " << point.y << ")";
return debug;
}
int main() {
Point p = {1, 2};
qDebug() << p;
return 0;
}
```
输出结果为:
```
Point(1, 2)
```
在这个例子中,我们重载了QDebug的输出操作符来输出自定义的类型Point。我们在输出Point类型值时,可以直接使用QDebug的输出操作符来输出,而不用手动构造输出的字符串。
相关问题
重载qdebug输出错误,只能输出十六进制地址
出现这种情况可能是因为重载的QDebug操作符没有正确处理传入的类型。
在重载QDebug的操作符时,需要根据传入的类型进行不同的处理。如果传入的类型是一个对象的指针,那么需要使用`qPrintable()`函数将其转换为一个字符串输出。
下面是一个示例代码:
```c++
#include <QDebug>
class MyClass {
public:
MyClass(int value) : m_value(value) {}
int value() const { return m_value; }
private:
int m_value;
};
QDebug operator<<(QDebug dbg, const MyClass *obj)
{
if (!obj) {
dbg << "MyClass(0x0)";
} else {
dbg << "MyClass(" << obj->value() << ")";
}
return dbg;
}
```
这个函数将MyClass类型的指针转换为一个字符串输出,并将输出的数据标记为MyClass类型。
使用示例:
```c++
int main()
{
MyClass *obj = new MyClass(42);
qDebug() << obj;
delete obj;
return 0;
}
```
输出结果:
```
MyClass(42)
```
可以看到,输出的是MyClass类型的值,而不是十六进制地址。
重载qdebug输出十六进制
你可以通过重载QDebug类的operator<<()函数实现在QDebug中输出十六进制。下面是一个示例代码:
```c++
#include <QDebug>
#include <QByteArray>
QDebug operator<<(QDebug dbg, const QByteArray &data)
{
dbg << "QByteArray(" << data.size() << "): ";
const char *ptr = data.constData();
for (int i = 0; i < data.size(); ++i) {
dbg << QString("%1").arg(static_cast<quint8>(ptr[i]), 2, 16, QLatin1Char('0')).toUpper() << " ";
}
dbg.nospace();
return dbg.space();
}
```
这个函数将QByteArray类型的数据转换为十六进制输出,并将输出的数据标记为QByteArray类型。
使用示例:
```c++
int main()
{
QByteArray data("hello");
qDebug() << data.toHex(); // 默认输出十六进制
qDebug() << data; // 重载后输出十六进制
return 0;
}
```
输出结果:
```
"68656C6C6F"
QByteArray(5): 68 65 6C 6C 6F
```
可以看到,输出的QByteArray类型的数据已经被转换为十六进制输出了。
阅读全文