Russian Qt Forum

Qt => Общие вопросы => Тема начата: ammaximus от Октябрь 22, 2013, 09:16



Название: QLogCat
Отправлено: ammaximus от Октябрь 22, 2013, 09:16
Вдохновленный Android LogCat и QDebug написал свою библиотеку для отладки. Основные фишки - простота использования и отладка по сети (что мне необходимо).
Код:
#define defPort 13093   // Порт по умолчанию
#define defTag "System" // Журнал по умолчанию

// Типы сообщений
namespace eQLCMessageT {
enum eQLCMessageType{
    Verbose=0,  // Подробности
    Debug=1,    // Отладка
    Info,       // Информирующее сообщение
    Warning=2,  // Предупреждение
    Error=3,    // Ошибка
    Assert=4,   // Утверждение
    Fatal=5     // Фатальная ошибка
};
}
typedef eQLCMessageT::eQLCMessageType QLCMessage;

/// /////
/// Интерфейс, позволяющий выводить в отладчик целые объекты
/// /////

class QLSHARED_EXPORT QLCattable
{
public:
    virtual void printDebug()=0;    // Вывести отладочное сообщение с краткой информацией
    virtual void dump()=0;          // Дамп содержимого объекта
};

/// ///////////
/// Класс отправки отладочных сообщений для QLogCat
/// ///////////
class QLSHARED_EXPORT ql
{
    static QHostAddress qlcAddress;
    static int port;
public:
    ql(QString message, QLCMessage type = eQLCMessageT::Debug, QString log = defTag);  // Создание объекта
//    ql(ql& copy);
    ~ql(); // То самое место, которое отправляет по завершению цепочки <<

    // Установка сетевого адреса
    static void setQLogCatAddress(QHostAddress address, int port=defPort);

    // Функции выдачи сообщений разного уровня
    // Функции оператора <<
    ql operator<<(const QString &str);
    ql operator<<(const QVariant val);

    static ql v();  // Уровень отладки подробности
    static ql d();  // Уровень отладки отладка
    static ql i();  // Уровень отладки информация
    static ql w();  // Уровень отладки предупреждение
    static ql e();  // Уровень отладки ошибка
    static ql a();  // Уровень отладки утверждение
    static ql f();  // Уровень отладки критическая ошибка

    // Статические функции
    static void v(QVariant val, QString tag = defTag);
    static void d(QVariant val, QString tag = defTag);
    static void i(QVariant val, QString tag = defTag);
    static void w(QVariant val, QString tag = defTag);
    static void e(QVariant val, QString tag = defTag);
    static void a(QVariant val, QString tag = defTag);
    static void f(QVariant val, QString tag = defTag);

    // Функции класса
    void vv(QVariant str);
    void dd(QVariant str);
    void ii(QVariant str);
    void ww(QVariant str);
    void ee(QVariant str);
    void aa(QVariant str);
    void ff(QVariant str);

    // Служебные функции
protected:
    static void sendMessage(QString string, int type, QString log, QTime time);
    QString message;
    QString log;
    QLCMessage type;

};

1. Зацените мой велосипед в целом.
2. ql::d() << "Stream check: ";// Преобразование к QVariant не происходит
3. ql::d() << QString("Stream check: ") << QString("it should be string"); - вызывается куча конструкторов копирования, соответственно куча деструкторов, соответственно посылается все три раза. Попытался переопределить конструктор копирования - вообще ничего не работает.

p.s. В аттаче библиотека и приложение для нее.


Название: Re: QLogCat
Отправлено: mutineer от Октябрь 22, 2013, 09:55
Возвращай из operator<<() ql& а не ql и не будет кучи деструкторов


Название: Re: QLogCat
Отправлено: kambala от Октябрь 22, 2013, 10:38
называть методы одной/двумя буквами не очень хорошо, как, впрочем, и классы

P.S. сначала прочитал название как QLongCat и подумал, что тут будет программа про длиннокота (http://lurkmore.to/Длиннокот) :D


Название: Re: QLogCat
Отправлено: mutineer от Октябрь 22, 2013, 10:40
2. ql::d() << "Stream check: ";// Преобразование к QVariant не происходит

А почему должно быть преобразование? у тебя же определен operator<<(QString)


Название: Re: QLogCat
Отправлено: ammaximus от Октябрь 22, 2013, 10:43
1. Если ставить ql& - вылетает
2. Когда проверял String комментировал.
3. Название временное, пока фантазии чет не хватает)


Название: Re: QLogCat
Отправлено: mutineer от Октябрь 22, 2013, 10:45
1. Если ставить ql& - вылетает
2. Когда проверял String комментировал.
3. Название временное, пока фантазии чет не хватает)

1. Если посмотришь на уже готовые операторы потокового вывода (например у QDebug()) то увидишь что все они как раз ссылку и возвращают чтобы избежать копирования. Если у тебя вылетает, то ты что-то напорол внутри метода. Рассказывай как вылетает и где.
2. Об этом мы как должны были догадаться?


Название: Re: QLogCat
Отправлено: ammaximus от Октябрь 22, 2013, 10:50
Раз концепция в целом верная пойду потыкаю немного потом отпишу.


Название: Re: QLogCat
Отправлено: ammaximus от Октябрь 22, 2013, 12:14
Спасибо за подсказки, все работает. Есть ли какие-то аналоги того, что я делаю?