« 進捗記録 2014.6.12 | トップページ | ログファイルの機能を追加する オープンとクローズ »

2014年6月13日 (金)

ログファイルとメッセージダイアログ出力

まだエラーメッセージダイアログは出せません。

アプリケーションの動作ログを出力する機能とエラーメッセージダイアログを出力する機能って似てますよね。 エラーを表示したら、そのログはログファイルに残っていて欲しいですが、ダイアログに出すほどのものでもないメッセージもログファイルには残したい時もあります。

こういう機能を持った部品があるとうれしいですね。

LogMessageクラスをこういうクラスにしたいです…、どうしたらいいんでしょうかね…

最初はこのLogMessageクラスにいろいろな変数や関数をどんどん書こうかと思いました。で、実際に書いたら、もう面倒になるほどいろいろ書かないといけないことに気づきました。

こんなこと、Qtで開発している人がみなやってるのかと疑問に思い、「入門Qt4プログラミング」を眺めます。

「おお」

なんだか詳細は分かりませんが、継承というテクニックを使えば良さそうです。

つまり、QtのQMessageBoxというクラス(部品)を取り込んで、これを拡張する形で、ログファイルにも出力する機能を追加すればよさそうです。

継承の恩恵がイマイチ、ピンとこなかったのですが、こういうことなんですねぇ。

大体こんな感じでしょうか?

[logmessage.h]
// -*- mode: c++; coding: utf-8-unix -*-
// Copyright (c) 2014 FunFun <fu.aba.dc5@gmail.com>

#ifndef LOGMESSAGE_H
#define LOGMESSAGE_H

// System Header

// Qt Header
#include <QMessageBox>
#include <QString>

// Local Header

namespace brynhildr {

// phase ID
typedef enum {
  PHASE_BRYNHILDR = 0,
  PHASE_CONTROL,
  PHASE_GRAPHICS,
  PHASE_SOUND,
  PHASE_NUM
} PHASE_ID;

class LogMessage : public QMessageBox {
 public:
  // constructor
  LogMessage(QWidget *parent);

  // critical message
  int criticalMessage(PHASE_ID id,
					  const QString text,
					  StandardButton buttons,
					  StandardButton defaultButton);
};

} // end of namespace brynhildr

#endif // LOGMESSAGE_H


[logmessage.cpp]
// -*- mode: c++; coding: utf-8-unix -*-
// Copyright (c) 2014 FunFun <fu.aba.dc5@gmail.com>

// System Header

// Qt Header
#include <QString>

// Local Header
#include "logmessage.h"
#include "settings.h"

namespace brynhildr {

// phase name
QString phaseName[PHASE_NUM] = {
  QObject::tr("[brynhildr] "),
  QObject::tr("[control] "),
  QObject::tr("[graphics] "),
  QObject::tr("[sound] "),
};

LogMessage::LogMessage(QWidget *parent)
{
}

// critical message
int LogMessage::criticalMessage(PHASE_ID id,
								const QString text,
								StandardButton buttons,
								StandardButton defaultButton)
{
  int ret;

  // output dialog
  ret = critical(this,
				 QTB_APPLICATION,
				 phaseName[id] + text,
				 buttons,
				 defaultButton);

  // TODO: output Log File

  return ret;
}

} // end of namespace brynhildr


今はcriticalなメッセージを扱うcriticalMessage()という関数しか追加していないのですがQMessageBoxの関数とか変数とかも同じように使えます。criticalMessage()にはまだダイアログを出す処理しか書いてません、別途受け取った引数を元にログファイルにログを出力する機能を追加しなくてはなりませんね。ま、ベースはできたので、少しづつ実装します。

« 進捗記録 2014.6.12 | トップページ | ログファイルの機能を追加する オープンとクローズ »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: ログファイルとメッセージダイアログ出力:

« 進捗記録 2014.6.12 | トップページ | ログファイルの機能を追加する オープンとクローズ »