画面上で時刻情報を使いたい場合の例として、
Qtでタイマを扱うサンプルを作成してみました。
開発環境の準備につきましては、
以下を参照いただければと思います。
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);
ボタン押下後の実行画面