1. ホーム

QT5のQTimerは間違えやすい、正しい使い方

2022-02-12 10:28:24

     実際には、遅延やタイミングを計るための関数があることが多く、C++やCでは、関数をカスタマイズすることができます。また,Sleep (number)という関数もあり,numberは何msの遅延が必要かを表します.

       ここでは、QT5のタイマクラスであるQTimerを紹介します。 タイマクラスであるQTimerは、タイマが作動したときに信号を発射するタイマを提供し、一般的には次のような形式でプログラムされます。

  QTimer *timer = new QTimer(this);
  timer->start(2000); //this statement doesn't just run once, it keeps running, so a judgment statement is needed to end it
  connect(timer, SIGNAL(timeout()), this, SLOT(myTimeout1()));

最初の文は、thisポインタが指す現在のインターフェイスにタイマーを定義しています。つまり、タイマーポインタの親ウィンドウはthisポインタが指すウィンドウインターフェイスです。

2番目の文は、タイマーの計時を開始すると、2000msの間、計時されることを意味し、次の2つの文とも等価である。

  timer->setInterval(2000);
  timer->start(); 

同じことをするのです。

3番目の文は、明らかに、2000msが経過すると、関数timeout()シグナルが発せられ、クエリによって次のように動作することを意味します。

void QTimer::timeout()

このシグナルは、タイマーがタイムアウトしたときに発せられます。

このtimeout()関数は、スロット関数timerDone()に関連付けられ、スロット関数を実行します。

ここからがキモ!3回言うことが重要です。3回言うことが重要です! 3回言うことが重要です!

2行目のコードに注目してください。

      timer->start( 2000 ); // 2 seconds to trigger the timer

この行は、2000ミリ秒ごとにタイマーを再起動させ、stop()が呼ばれてタイマーがオフにならない限り、再びスロット関数を呼び出しています。例えば次のようになります。

 QTimer *timer = new QTimer();
 timer->setInterval(100);//run the connect() function every 5 seconds after the time runs out.
 timer->start(); //this statement doesn't just run once, it keeps running, so it needs a judgment statement to end
 connect(timer, SIGNAL(timeout()), this, SLOT(myTimeout1()));
 if(number>118)
     {
        number=0;
        timer->stop();
     }

ここではグローバル変数の番号が定義されており、118回タイマーを動作させ、119回目以降はタイミング機能を使用しないようにすることが目的です。

void :myTimeout1()
{
    number++;
    QString str1;      
// set the variable to a global variable, an array
    if(number<110)
    {
        str1=QString("%1").arg(data1[number][0]);
        ui->tableWidget_3->setItem(0,0,new QTableWidgetItem(str1));
    }
}

data1[ ][ ] はグローバル配列として定義されています。

以上、タイマーの個人的なまとめです、あまりうまく書けないことをお許しください、質問があればコメントを残してください。