<< QT && C++
デバッグメッセージのカスタマイズ
qDebugやqCritical関数などを使ってコンソールに表示されるデバッグ情報は種類によらず見た目が同じなので区別しにくいです。
そこでそのような場合にはあらかじめどのようにメッセージを表示するかの形式を決めておくことができます。
例えばデバッグ情報には"DEBUG: "、警告には"WARNING: "を前に表示することにしたい場合は次のような関数を定義してqInstallMessageHandlerにその関数を渡します。
#include <QApplication> #include <QtDebug> /**メッセージのカスタマイズ関数*/ void myDebugOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg){ QByteArray localMsg = msg.toLocal8Bit(); switch(type){ case QtDebugMsg: cout << "DEBUG: " << localMsg.constData() << std::endl; break; case QtWarningMsg: cout << "WRNING: " << localMsg.constData() << std::endl; break; case QtCriticalMsg: cout << "CRITICAL: " << localMsg.constData() << std::endl; break; case QtFatalMsg: cout << "FATAL: " << localMsg.constData() << std::endl; abort(); } } int main(int argc, char *argv[]) { qInstallMessageHandler(myDebugOutput); //カスタムしたメッセージ表示をインストール QApplication app(argc, argv); return app.exec(); }
これだけでデバッグ情報がだいぶ見やすくなると思います。
メッセージトレース
さらにこの方法を使えば見やすくするだけでなく、どのソースファイルの何行のどの関数からメッセージが送られてきたか(メッセージトレース)を表示させることも出来ます。
実際にそのようにメッセージ表示関数を書き換えると次のようなコードになります
/**メッセージのカスタマイズ*/ void myDebugOutput(QtMsgType type, const QMessageLogContext & context, const QString & msg){ QByteArray localMsg = msg.toLocal8Bit(); switch(type){ case QtDebugMsg: cout << "DEBUG: " << localMsg.constData() << context.file << context.line << context.function; << std::endl break; //以下略... } }
メッセージが送られてきたファイル情報を保持しているのがQMessageLogContextです。このオブジェクトからどのファイルの何行目のどの関数からメッセージ表示されているかを知ることができます。
例外が投げた時などにどこで例外が起こったか調べるのに便利そうです。
以上、デバッグメッセージの表示でした。では、また!
© Kaz