首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何重载qDebug的operator<<

如何重载qDebug的operator<<
EN

Stack Overflow用户
提问于 2010-04-21 02:17:51
回答 3查看 19K关注 0票数 23

我正在尝试为存储数据的类创建更有用的调试消息。我的代码看起来像这样

代码语言:javascript
复制
#include <QAbstractTableModel>
#include <QDebug>

/**
  * Model for storing data. 
  */
class DataModel : public QAbstractTableModel {
    // for debugging purposes
    friend QDebug operator<< (QDebug d, const DataModel &model);

    //other stuff
};

/**
  * Overloading operator for debugging purposes
  */
QDebug operator<< (QDebug d, const DataModel &model) {
    d << "Hello world!";
    return d;
}

我希望qDebug() << model会打印出"Hello world!“。但是,输出中总是有类似"QAbstractTableModel(0x1c7e520)“内容。

你知道出什么事了吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-21 02:57:32

玩弄这个问题一个小时后,我发现model是指向DataModel的指针,而我的运算符<<只接受引用。

票数 11
EN

Stack Overflow用户

发布于 2015-08-12 00:52:47

我知道这件事已经有很长时间了,但只是为了记录下来,并帮助其他最终有同样疑问的人,让qDebug() <<使用你自己的类打印"Hello World“或其他东西的最简单的方法是实现你的类到可打印类型的隐式转换,比如QString (这是QDebug很好的支持)。

代码语言:javascript
复制
class Foo {
public:
   Foo() { }
   operator QString() const { return <put your QString here>; }   

};
票数 28
EN

Stack Overflow用户

发布于 2017-05-09 19:49:56

您只实现了引用的<<运算符。如果你的model变量是一个指针,它将使用另一个实现(不是你的)。

要使用您的实现,您可以执行以下操作:

代码语言:javascript
复制
qDebug() << *model

顺便说一下,实现QDebug operator<<(QDebug dbg, const T &data)重载的正确方法是使用QDebugStateSaver类:

代码语言:javascript
复制
QDebug operator<<(QDebug dbg, const QDataflowModelOutlet &outlet)
{
    QDebugStateSaver stateSaver(dbg);
    dbg.nospace() << ...;
    return dbg;
}

这样,在退出功能时,设置(即是否在打印之间插入空格)将被正确恢复。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2677577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档