Qt事件系統之四:定時器事件與隨機數


一、定時器事件和隨機數

QTimerEvent類用來描述一個定時器事件。對於一個QObject的子類,只需要使用int QObject::startTimer ( int interval)函數來開啟一個定時器,這個函數需要輸人一個以毫秒為單位的整數作為參數來表明設定的時間,它返回一個整型編號來代表這個定時器。當定時器溢出時就可以在timerEvent()函數中獲取該定時器的編號來進行相關操作。

其實編程中更多的是使用QTimer類來實現一個定時器,它可以使用信號和槽,還可以設置只運行一次的定時器。所以如果使用定時器,那么一般都是使用的QTimer類。

關於隨機數,在Qt中是使用qrand()和qsrand()兩個函數實現的。


二、通過ID使用定時器

使用QTimerEvent的timerId()函數來獲取定時器的編號,然后判斷是哪一個定時器並分別進行不同的操作。

在頭文件.h中進行聲明:

private:
    Ui::Widget *ui;

    int id1,id2,id3; //定時器的編號

protected:
    void timerEvent(QTimerEvent *event); //定時器事件

在.cpp中進行實現相應的功能:

//構造函數
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    id1 = startTimer(1000); //開啟一個1秒定時器,並返回其id
    id2 = startTimer(2000);
    id3 = startTimer(4000);
}

//定時器事件
void Widget::timerEvent(QTimerEvent *event)
{
    //1秒鍾時間到,則定時器1溢出
    if (event->timerId() == id1)
    {
        qDebug()<<"timer1";
    }
    else if(event->timerId() == id2)
    {
        qDebug()<<"timer2";
    }
    else if (event->timerId() == id3)
    {
        qDebug()<<"timer3";
    }
}

“應用程序輸出”窗口輸出如下:

timer1
timer1
timer2
timer1
timer1
timer2
timer3

三、通過信號和槽實現定時器

在頭文件.h中進行聲明:

private slots:
    void timeOut(); //定時器超時函數

在.cpp中進行實現相應的功能:

//構造函數
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //創建一個新的定時器
    QTimer *timer = new QTimer(this);
    //設置定時器1秒鍾超時
    timer->start(1000);
    //關聯定時器的超時信號到槽上
    connect(timer,SIGNAL(timeout()),this,SLOT(timeOut()));
}

Widget::~Widget()
{
    delete ui;
}

//定時器超時函數
void Widget::timeOut()
{
    QTime time = QTime::currentTime();      // 獲取當前時間
    QString text = time.toString("hh:mm:ss");  // 轉換為字符串
    if((time.second() % 2) == 0)
    {
        //每隔一秒就將“:”顯示為空格
        text[2]=' ';
        text[5]=' ';
    }
    qDebug() << text;
}

這里在構造函數中開啟了一個1秒的定時器,當它溢出時就會發射timeout()信號,這時就會執行我們的定時器溢出處理函數。在槽里我們獲取了當前的時間,並且將它轉換為可以顯示的字符串。

“應用程序輸出”窗口輸出如下:

"15:36:23"
"15 36 24"
"15:36:25"
"15 36 26"

四、隨機數

在頭文件.h中進行聲明:

private slots:
    void timeOut(); //定時器超時函數

在.cpp中進行實現相應的功能:

//構造函數
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    //創建一個新的定時器
    QTimer *timer = new QTimer(this);
    //設置定時器1秒鍾超時
    timer->start(1000);
    //關聯定時器的超時信號到槽上
    connect(timer,SIGNAL(timeout()),this,SLOT(timeOut()));

    //使用qsrand()函數為隨機數設置初值
    qsrand(static_cast<uint>( QTime(0, 0, 0).secsTo(QTime::currentTime()) ));
}

//定時器超時函數
void Widget::timeOut()
{
    int rand = qrand()%300;//產生300以內的正整數
    qDebug()<< rand;
}

在使用qrand()函數產生隨機數之前,一般要使用qsrand()函數為其設置初值,如果不設置初值,那么每次運行程序,qrand()都會產生相同的一組隨機數。

為了每次運行程序時,都可以產生不同的隨機數,我們要使用qsrand()設置一個不同的初值。這里使用了QTime類的secsTo()函數,它表示兩個時間點之間所包含的秒數,比如代碼中就是指從零點整到當前時間所經過的秒數。

當使用qrand()要獲取一個范圍內的數值時,一般是讓它與一個整數取余,比如這里與300取余,就會使所有生成的數值在0-299之間。

“應用程序輸出”窗口輸出如下:

112
212
223
102

參考:

56 QT定時器事件和隨機數


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM