0
QString m_BoatProgramming("Boat Programming");
qDebug() << m_BoatProgramming;
qDebug() << QDate::currentDate();

私に与えます:

"Boat Programming"
"Saturday 20th, 2016"

状況によっては、端末の書式設定コードを見つけてメタデータを手動で入力するという面倒な作業をすべて行うのではなく、次のように出力したいと考えています。

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

これはすでに可能ですか、または qDebug() からクラスを派生させる必要がありますか?

4

1 に答える 1

1

はい、メッセージハンドラで可能です。また、必要なファイルにメッセージを書き込むこともできます。

要件に合わせてドキュメントを変更した例を次に示します。

#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 **))

より多くのマクロ マジックまたはテンプレートを使用すると、より便利な動作を実現できると思います。

注: このマクロの使用には注意してください。実際、exp は 2 回実行されます。

于 2016-02-20T10:45:47.873 に答える