2016-02-20 10 views
0
QString m_BoatProgramming("Boat Programming"); 
qDebug() << m_BoatProgramming; 
qDebug() << QDate::currentDate(); 

дает мне:Можете ли вы настроить QDebug для автоматического вывода с форматированием текста и вставить такие данные, как типы данных или пространства имён, которые он возвращает?

"Boat Programming" 
"Saturday 20th, 2016" 

В некоторых обстоятельствах, а не через все трудности найти коды терминала форматирования и вручную ввод в метаданных, я хотел бы его к выходу этого:

QStringm_BoatProgramming:"Boat Programming"
QDate::currentDate():"Saturday 20th, 2016"

Это уже возможно, или мне нужно сделать, чтобы получить класс от QDebug()?

ответ

1

Да, это возможно с message handler. Также он позволяет вам писать сообщения в файлы того, что вам нужно.

Вот модифицированный пример из дока в соответствии с вашими требованиями:

#include <QApplication> 
#include <stdio.h> 
#include <stdlib.h> 
#include <typeinfo> 

#include <QDebug> 

void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg) 
{ 
    QByteArray localMsg = msg.toLocal8Bit(); 
    switch (type) { 
    case QtDebugMsg: 
     fprintf(stderr, "Debug: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); 
     break; 
    case QtInfoMsg: 
     fprintf(stderr, "Info: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); 
     break; 
    case QtWarningMsg: 
     fprintf(stderr, "Warning: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); 
     break; 
    case QtCriticalMsg: 
     fprintf(stderr, "Critical: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); 
     break; 
    case QtFatalMsg: 
     fprintf(stderr, "Fatal: %s (%s:%u, %s)\n", localMsg.constData(), context.file, context.line, context.function); 
     abort(); 
    } 
} 

#define MY_DEBUG(exp) qDebug() << typeid(exp).name() << #exp << exp 

int main(int argc, char **argv) 
{ 
    qInstallMessageHandler(myMessageOutput); 
    QApplication app(argc, argv); 

    QString str = "Shit happens!"; 
    MY_DEBUG(str); 

    return 0; 
} 

Выведет:

Debug: class QString str "Shit happens!" (..\ProjectorControl\ProjectorControl\main.cpp:56, int __cdecl main(int,char **)) 

Я думаю, что с большим количеством макро магией или шаблонами вы можете достичь более Convient поведения.

Примечание: будьте осторожны с использованием этого макроса: на самом деле exp будет выполняться дважды.

+0

Должен ли я просто добавить класс в проект qt и импортировать его или перебросить его в один из моих классов? – Akiva

+1

@Akiva Извините, не понял тур. Можете ли вы подробнее рассказать об этом? – Jeka

+0

Где я определяю 'void myMessageOutput' и' MY_DEBUG'? – Akiva