我的QT Creator學習筆記(十五)——事件系統定時器事件與隨機數

QTimerEvent用來描述一個定時器事件。隊醫一個QObject的子類,只需要使用Int QObject::startTimer(int interval)函數就可以開啓一個定時器。輸入參數是毫秒爲單位的整數,表明設定的時間。返回值爲一個整型值,代表這個定時器的編號。當定時器溢出(即定時時間達到時)可以在timerEvent函數中進行需要的操作。

Qt中使用qrand和qsrand兩個函數實現隨機數。

新建Qt Widgets項目mytimerevent繼承自QtWidget,類名默認Widget。

       widget.h中添加函數聲明如下

protected:
    void timerEvent(QTimerEvent *event);

添加三個私有成員變量如下

int id1,id2,id3;

然後在widget.cpp的構造函數中,起3個定時器,定時時間分別爲1秒,1.5秒,2秒,代碼如下。

    id1=startTimer(1000);
    id2=startTimer(1500);
    id3=startTimer(2000);

定時器事件處理函數實現如下

void Widget::timerEvent(QTimerEvent *event)
{
    if(event->timerId()==id1)//判斷是哪個定時器
    {
        qDebug()<<"timer 1";
    }
    else if(event->timerId()==id2)
    {
        qDebug()<<"timer 2";
    }
    else if(event->timerId()==id3)
    {
        qDebug()<<"timer 3";
    }
}

運行效果打印如下信息

前面是實現QObject中的startTimer函數,其實編程中更多使用的是QTimer類實現一個定時器。它提供了更高層次的編程接口。下面使用 QTimer實現一個簡單電子錶功能。

上面工程中繼續添加內容,在設計模式中添加LCD Number部件。

widget.h中添加私有槽聲明如下。

private slots:
    void timerUpdate();

在widget.cpp中包含頭文件

#include <QTimer>
#include <QTime>

在構造函數中啓動定時器並將定時器溢出信號關聯到槽上,代碼如下

    QTimer* timer=new QTimer(this);//創建定時器
    connect(timer,&QTimer::timeout,this,&Widget::timerUpdate);//關聯定時器的溢出信號到槽上
    timer->start(1000);//設置溢出時間爲1秒,並啓動定時器

實現定時器溢出信號槽函數代碼如下

void Widget::timerUpdate()
{
    QTime time=QTime::currentTime();//獲取當前時間
    QString text=time.toString("hh:mm");//轉換爲字符串
    if((time.second()%2)==0)
        text[2]=' ';//每隔一秒將":"顯示爲空格
    ui->lcdNumber->display(text);
}

 使用QTime::currentTime獲取當前時間,使用QTime的second()函數來獲取秒的值,並與2取餘,爲0就將‘:’顯示爲空格,實現一秒閃爍一下的效果。

最後運行效果如下

使用隨機數函數來讓LCD部件每隔一秒移動一個隨機位置。

在構造函數中添加

qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));

這裏的意思是以從0點到當前時間的秒數,作爲qsrand的參數,即作爲隨機數的初始值。如果不設置初值,每次運行程序會產生相同的一組隨機數。

在timerUpdate函數裏添加以下代碼

    int rand=qrand()%300;//產生300以內的整隨機數
    ui->lcdNumber->move(rand,rand);

最後說一下使用QTimer::singleShot函數開啓一個只運行一次的定時器。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章