【Qt】SIGNAL-SLOTを使ってみる
Qtを使い始めたとき、SIGNAL-SLOTの使い方でまず躓きました。
pushButtonだと、スロットを登録すると勝手に関数を作ってくれて、
ボタンが押されたらこの関数が自動的に呼ばれるのだな、
ということがすぐわかり初心者でも作るのが簡単でした。
やりたいこと
現在時刻を1000ms毎に表示する
タイマーを作成する
時間をクラスで持っておくことにします。
# pika.h
QTimer *Timer;
# pika.cpp
コンストラクタかどこかで設定する
Timer = new QTimer();
Timer->setSingleShot(false);
Timer->setInterval(1000);
Timer->setTimerType(Qt::PreciseTimer);
Timer->start();
カウントは1000ms毎、タイマータイプも設定できるようです。
タイプについては以下に記載されていました。
タイプによって精度が違うようです。
そして、作成したおいたラベルに、コンストラクタで現在時刻の最初に表示する時間を設定します。
QDateTime dt = QDateTime::currentDateTime();
ui->label->setText(dt.toString("yyyy/MM/dd hh:mm:ss"));
初めタイマーを作成したら、自動的にevent()で通知されるのかな?とか思っていたのですが、eventで呼ばれる方のタイマーはQObjectのstartTimerの方でした。
スロット関数を作成
QTimerの方はconnect関数を作り、時間が来たら通知される関数(SLOT)を作成しておいて、この関数をconnect関数で指定 しておく必要があります。まずSLOTを作成します。
# pika.h
private slots:
void updateTimer();
# pika.cpp
void Pika::updateTimer()
{
QDateTime dt = QDateTime::currentDateTime();
ui->label->setText(dt.toString("yyyy/MM/dd hh:mm:ss"));
}
connect指定
connect(Timer,SIGNAL(timeout()),this,SLOT(updateTimer()));
Timerは上記で作成していたTimerです。
1000msが経ったら、同じクラス(Pikaクラス)のupdateTimerに通知されます。
動かしてみる……
1秒ごとに現在時間が更新されます。
ついでにピカチュウのところも、同じようにタイマー10秒、connectを作成してピカチュウの声が変わるようにしてみました。
参考