at_mangetsu
2016年2月26日 20時32分
前回(Armadillo-440+Qtで時刻を扱う)の続きです。
画面上でモーションのある動作をさせる場合の例として、
Qtでウェイトをかけながらモーション表示を行う方法を紹介します。
開発環境の準備につきましては、
以下を参照いただければと思います。
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();
ボタン押下後の画面