memo

プログラミング備忘録





【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毎、タイマータイプも設定できるようです。

タイプについては以下に記載されていました。

Qt Namespace | Qt Core 5.11

タイプによって精度が違うようです。

 

そして、作成したおいたラベルに、コンストラクタで現在時刻の最初に表示する時間を設定します。 

    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に通知されます。

 

動かしてみる…… 

f:id:shinopikapi:20180603215659p:plain

1秒ごとに現在時間が更新されます。

 

f:id:shinopikapi:20180603215938p:plain

f:id:shinopikapi:20180603215733p:plain

ついでにピカチュウのところも、同じようにタイマー10秒、connectを作成してピカチュウの声が変わるようにしてみました。

 

参考

QTimer Class | Qt Core 5.11