ブログ

Armadillo-440+Qtで動作にウェイトをかける

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();


ボタン押下後の画面