Как перегрузить оператор << для qDebug - PullRequest
19 голосов
/ 20 апреля 2010

Я пытаюсь создать более полезные сообщения отладки для моего класса, где хранятся данные. Мой код выглядит примерно так

#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)».

Ты хоть представляешь, что не так?

Ответы [ 5 ]

20 голосов
/ 11 августа 2015

Я знаю это уже давно, но только для того, чтобы документировать и помочь другим людям, которые в конечном итоге приходят сюда с такими же сомнениями, самый простой способ заставить qDebug () << работать с вашим собственным классом, печатая что-то вроде "Hello Мир "или что-то еще, это реализовать неявное преобразование вашего класса в печатный тип, такой как QString (который хорошо поддерживается QDebug). </p>

class Foo {
public:
   Foo() { }
   operator QString() const { return <put your QString here>; }   

};
12 голосов
/ 20 апреля 2010

После часа игры с этим вопросом я выяснил, model это указатель на DataModel, а мой оператор << принимает только ссылки.

9 голосов
/ 10 ноября 2012

В вашем примере qDebug () печатает адрес вашей переменной, который является поведением по умолчанию для неизвестных типов.

На самом деле, кажется, вам нужно позаботиться о двух вещах:

  • Получить предмет по значению (и Евгений уже указал на него!).
  • Определите оператор перегрузки перед его использованием, поместите его подпись в заголовочный файл или определите его как forward перед использованием (в противном случае вы получите поведение по умолчанию "qDebug () <<"). </li>

Это даст вам:

QDebug operator<< (QDebug d, const DataModel &model) {
    d << "Hello world!";
    return d;
}
DataModel m;
qDebug() << "m" << m;

или

QDebug operator<< (QDebug d, const DataModel &model);

DataModel m;
qDebug() << "m" << m;

QDebug operator<< (QDebug d, const DataModel &model) {
    d << "Hello world!";
    return d;
}

Я тоже научился этому нелегко ...

3 голосов
/ 22 мая 2016

Я нашел этот ответ на форуме QT от raven-worx (отдавая должное кредитам!)

В файле .h:

QDebug operator<<(QDebug dbg, const MyType &type);

, где MyType - ваш класс, например DataModel, а type - экземпляр, который вы будете отображать.

А в файле .cpp:

QDebug operator<<(QDebug dbg, const MyType &type)
{
    dbg.nospace() << "MyType(" << .... << ")";
    return dbg.maybeSpace();
}

и вы можете использовать QDebug space(), nospace() и другие методы для точного управления отображением потока.

Так что для OP мы будем использовать:

// in the .h file:
class DataModel : public QAbstractTableModel {
// stuff
};
QDebug operator<<(QDebug dbg, const DataModel &data);

// in the .cpp file:
QDebug operator<<(QDebug dbg, const DataModel &data)
{
    dbg.nospace() << "My data {" << data.someField << ',' << data.another << "}";
    return dbg.maybeSpace();
}

// in some .cpp user of the class:
DataModel myData;

. . .

QDebug() << "The current value of myData is" << myData;
2 голосов
/ 09 мая 2017

Вы реализовали только оператор << для справки. Если ваша переменная <code>model является указателем, она будет использовать другую реализацию (не вашу).

Для использования вашей реализации вы можете сделать:

qDebug() << *model

Кстати, правильный способ реализации перегрузки QDebug operator<<(QDebug dbg, const T &data) - это использование класса QDebugStateSaver:

QDebug operator<<(QDebug dbg, const QDataflowModelOutlet &outlet)
{
    QDebugStateSaver stateSaver(dbg);
    dbg.nospace() << ...;
    return dbg;
}

Таким образом, настройки (т. Е. Будут ли вставлены или нет пробелы между отпечатками) будут корректно восстановлены при выходе из функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...