Russian Qt Forum
Октябрь 01, 2024, 02:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QLogCat  (Прочитано 3819 раз)
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. В аттаче библиотека и приложение для нее.
« Последнее редактирование: Октябрь 22, 2013, 09:40 от ammaximus » Записан
mutineer
Гость
« Ответ #1 : Октябрь 22, 2013, 09:55 »

Возвращай из operator<<() ql& а не ql и не будет кучи деструкторов
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #2 : Октябрь 22, 2013, 10:38 »

называть методы одной/двумя буквами не очень хорошо, как, впрочем, и классы

P.S. сначала прочитал название как QLongCat и подумал, что тут будет программа про длиннокота Веселый
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
mutineer
Гость
« Ответ #3 : Октябрь 22, 2013, 10:40 »

2. ql::d() << "Stream check: ";// Преобразование к QVariant не происходит

А почему должно быть преобразование? у тебя же определен operator<<(QString)
Записан
ammaximus
Гость
« Ответ #4 : Октябрь 22, 2013, 10:43 »

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

1. Если ставить ql& - вылетает
2. Когда проверял String комментировал.
3. Название временное, пока фантазии чет не хватает)

1. Если посмотришь на уже готовые операторы потокового вывода (например у QDebug()) то увидишь что все они как раз ссылку и возвращают чтобы избежать копирования. Если у тебя вылетает, то ты что-то напорол внутри метода. Рассказывай как вылетает и где.
2. Об этом мы как должны были догадаться?
« Последнее редактирование: Октябрь 22, 2013, 10:48 от mutineer » Записан
ammaximus
Гость
« Ответ #6 : Октябрь 22, 2013, 10:50 »

Раз концепция в целом верная пойду потыкаю немного потом отпишу.
Записан
ammaximus
Гость
« Ответ #7 : Октябрь 22, 2013, 12:14 »

Спасибо за подсказки, все работает. Есть ли какие-то аналоги того, что я делаю?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 23.