如何重载运算符<<用于 qDebug
我正在尝试为存储数据的类创建更有用的调试消息。我的代码看起来像这样,
#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)”的内容。
你知道出了什么问题吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我知道它很长时间了,但只是为了记录并帮助最终来到这里有同样疑问的任何其他人,获得 qDebug() << 的最简单方法使用您自己的类打印“Hello World”或其他任何内容,就是实现您的类到可打印类型的隐式转换,如 QString(QDebug 很好地支持)。
I know it long time now, but just to be documented and to help any other people who eventually come here having the same doubt, the easiest way to get qDebug() << working with your own class printing something like "Hello World" or whatever else, is to implement implicit conversion of your class to a printable type, like QString (which is well supported by QDebug).
在您的示例中, qDebug() 打印变量的地址,这是未知类型的默认行为。
事实上,似乎有两件事你必须注意:
这会给你:
或者
我也通过艰难的方式学会了它......
In your example, qDebug() prints the address of your variable, which is the default behavior for unknown types.
In fact, there seem to be two things you have to take care of:
This will give you:
or
I've learned it the hard way, too...
经过一个小时的思考这个问题后,我发现
model
是指向 DataModel 的指针,而我的运算符<<
仅接受引用。After an hour of playing with this question I figured out
model
is pointer to DataModel and my operator<<
takes only references.您仅实现了 <<运营商供参考。如果您的 model 变量是指针,它将使用另一个实现(不是您的)。
要使用您的实现,您可以执行以下操作:
顺便说一下,实现
QDebug 运算符<<(QDebug dbg, const T &data)
重载的正确方法是使用QDebugStateSaver< /code> class:
这样,退出该功能时,设置(即是否在打印之间插入空格)将被正确恢复。
You implemented only the << operator for a reference. If your
model
variable is a pointer, it will use another implementation (not yours).To use your implementation you can do:
By the way, the correct way to implement a
QDebug operator<<(QDebug dbg, const T &data)
overload is to use theQDebugStateSaver
class:In this way the settings (i.e. wether to insert or not spaces between prints) will be correctly restored when exiting the function.
我发现 这个答案在 QT 论坛上,作者:raven-worx(在应得的地方给予奖励!)
在
.h
文件中: code>MyType 是您的类,就像
DataModel
一样,而type
是您将显示的实例。而在
.cpp
文件中:并且可以使用QDebug的
space()
、nospace()
等方法来控制确切的显示流的。因此对于OP,我们将使用:
I found this answer on the QT Forum by raven-worx (giving credit where credit is due!)
In the
.h
file:where
MyType
is your class, likeDataModel
andtype
is the instance you will display.And in the
.cpp
file:and you can use the QDebug's
space()
,nospace()
, and other methods to control the exact display of the stream.So for the OP, we would use: