ブログ

Armadillo-440+Qtで時刻を扱う

at_mangetsu
2016年2月26日 16時35分

画面上で時刻情報を使いたい場合の例として、
Qtでタイマを扱うサンプルを作成してみました。

開発環境の準備につきましては、
以下を参照いただければと思います。

HowTo:Armadillo-440でQt!第2回

Qtプロジェクトファイル一式を添付します。
test_timer.tar.gz
※ATDE上で展開後、Qt Creatorでtest_timer.proファイルをプロジェクトとして読み込んでご使用ください。

ボタンを押すと数のカウントが始まり、
経過時間を表示する、というものです。


初期画面

ポイントは「mainwindow.cpp」になります。

1)QDateTimeクラスを使いますので、6行目でインクルードしています。

#include <QDateTime>

2)数える回数をGOALで定義しています(8行目)

#define   GOAL   100

3)ボタン押下後に実行されるメソッドon_pushButton_clicked()内の記述を見ていただければと思います。

void MainWindow::on_pushButton_clicked()
{
    int i=0,j=0,diff1,diff0,len=0;
    QEventLoop loop;
    QDateTime now;
    QDateTime org=QDateTime::currentDateTime();
    QString result;
    for(i=0;i<=GOAL;i++){
      ui->label->setText(QString::number(i));
      now=QDateTime::currentDateTime();
      diff0=abs(now.secsTo(org));
      diff1=abs(now.msecsTo(org))-diff0*1000;
      result=QString::number(diff1);
      len=result.length();
      for(j=0;j<3-len;j++)
          result="0"+result;
      result=QString::number(diff0)+"."+result;
      ui->label_2->setText(result);
      QTimer::singleShot(TIMER, &loop, SLOT(quit()));
      loop.exec();
    }
}

ここで、
a)時刻の取得

    QDateTime org=QDateTime::currentDateTime();

にて、ボタンが押された時刻を取得します。
その後、数を数えるごとに

      now=QDateTime::currentDateTime();

にて現在時刻を取得します。
b)経過時間の計算

      diff0=abs(now.secsTo(org));
      diff1=abs(now.msecsTo(org))-diff0*1000;

のように、QDateTime::secsTo()およびQDateTime::msecsTo()を使うことで、
ボタンが押された時刻からの経過時刻を計算しています。
diff0は秒単位で算出しています。
diff1はミリ秒単位で算出し、1秒未満の数値だけを抜き出しています。
※計算方法はこの限りではありません(今回はQDateTimeクラスの2つのメソッドを使ってみました)

次に画面への表示処理を行います。

      result=QString::number(diff1);
      len=result.length();
      for(j=0;j<3-len;j++)
          result="0"+result;
      result=QString::number(diff0)+"."+result;
      ui->label_2->setText(result);

ここでは、まずミリ秒部の表示処理を行います。
「ミリ秒を示す数値」から「3桁のミリ秒文字列」を生成させるため、

      result=QString::number(diff1);
      len=result.length();

でミリ秒部の数値を文字列化し、その文字数(桁数)を求めます。
その後、足りない桁を「0」でパディングします。

      for(j=0;j<3-len;j++)
          result="0"+result;

最後に、秒数を左側に加えて、表示用の文字列を生成しています。

      result=QString::number(diff0)+"."+result;
      ui->label_2->setText(result);


ボタン押下後の実行画面