at_mangetsu
2016年2月26日 20時32分
前回(Armadillo-440+Qtで時刻を扱う)の続きです。
画面上でモーションのある動作をさせる場合の例として、
Qtでウェイトをかけながらモーション表示を行う方法を紹介します。
開発環境の準備につきましては、
以下を参照いただければと思います。
HowTo:Armadillo-440でQt!第2回
Qtプロジェクトファイル一式を添付します。
test_timer.tar.gz
※ATDE上で展開後、Qt Creatorでtest_timer.proファイルをプロジェクトとして読み込んでご使用ください。
ボタンを押すと数のカウントが始まり、
経過時間を表示する、というものです。
※前回のブログと同じサンプルです。
初期画面
ポイントは「mainwindow.cpp」になります。
1)QEventLoopクラスとQTimerクラスを使いますので、4-5行目でインクルードしています。
#include <QTimer>
#include <QEventLoop>
2)ウェイト時間(ミリ秒)をTIMERで定義しています(8行目)
#define TIMER 30
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)QEventLoopクラスの使用を宣言しています。
QEventLoop loop;
b)QTimer::singleShot()を使い、タイマ動作をloopに設定後実行することで、TIMERに設定した分のウェイトがかかるようになります。
QTimer::singleShot(TIMER, &loop, SLOT(quit()));
loop.exec();
ボタン押下後の画面