雷火电竞-中国电竞赛事及体育赛事平台

歡迎來到入門教程網(wǎng)!

C語言

當(dāng)前位置:主頁 > 軟件編程 > C語言 >

Qt定時(shí)器和隨機(jī)數(shù)詳解

來源:本站原創(chuàng)|時(shí)間:2020-01-10|欄目:C語言|點(diǎn)擊:

環(huán)境是:Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1

一、定時(shí)器

Qt中有兩種方法來使用定時(shí)器,一種是定時(shí)器事件,另一種是使用信號(hào)和槽。一般使用了多個(gè)定時(shí)器時(shí)最好使用定時(shí)器事件來處理。

1.新建Qt Gui應(yīng)用,項(xiàng)目名稱為myTimer,基類選擇QWidget,類名為Widget。

2.到widget.h文件中添加函數(shù)聲明:
protected:
    void timerEvent(QTimerEvent *);
然后添加私有變量定義:
int id1, id2, id3;

3.下面到設(shè)計(jì)模式,向界面上拖入兩個(gè)標(biāo)簽部件Label。

4.下面進(jìn)入widget.cpp文件,先在構(gòu)造函數(shù)中添加如下代碼:

id1 = startTimer(1000); // 開啟一個(gè)1秒定時(shí)器,返回其ID
id2 = startTimer(2000);
id3 = startTimer(10000);

這里開啟了三個(gè)定時(shí)器,分別返回了它們的id,這個(gè)id用來區(qū)分不同的定時(shí)器。定時(shí)器的時(shí)間單位是毫秒。每當(dāng)一個(gè)定時(shí)器溢出時(shí),都會(huì)調(diào)用定時(shí)器事件處理函數(shù),我們可以在該函數(shù)中進(jìn)行相應(yīng)的處理。

5.下面添加定時(shí)器事件處理函數(shù)的定義:

void Widget::timerEvent(QTimerEvent *event)
{
  if (event->timerId() == id1) {    // 判斷是哪個(gè)定時(shí)器
    ui->label->setText(tr("%1").arg(qrand()%10));
  }
  else if (event->timerId() == id2) {
    ui->label_2->setText(tr("hello world!"));
  }
  else {
    qApp->quit();
  }
}

這里先使用timerId()函數(shù)返回了溢出的定時(shí)器的id,然后根據(jù)該id來判斷是哪個(gè)定時(shí)器溢出了,并進(jìn)行相應(yīng)的處理。每當(dāng)?shù)谝粋€(gè)定時(shí)器溢出時(shí)都產(chǎn)生一個(gè)小于10的隨機(jī)數(shù);當(dāng)?shù)诙€(gè)定時(shí)器溢出時(shí),就更改標(biāo)簽的文本;當(dāng)?shù)谌齻€(gè)定時(shí)器溢出時(shí)則退出應(yīng)用程序?,F(xiàn)在可以運(yùn)行程序,查看效果。

6.如果只是想開啟少量的定時(shí)器,也可以使用信號(hào)和槽來實(shí)現(xiàn)。
先在widget.h中添加一個(gè)私有槽聲明:

private slots:
  void timerUpdate();

然后到設(shè)計(jì)模式向界面上添加一個(gè)行編輯器部件Line Edit,再到widget.cpp中添加頭文件包含:

#include <QTimer>
#include <QDateTime>

然后在構(gòu)造函數(shù)中添加如下代碼:

QTimer *timer = new QTimer(this);
//關(guān)聯(lián)定時(shí)器溢出信號(hào)和相應(yīng)的槽函數(shù)
connect(timer, SIGNAL(timeout()), this, SLOT(timerUpdate()));
timer->start(1000);

這里創(chuàng)建了一個(gè)定時(shí)器,并將其溢出信號(hào)和更新槽關(guān)聯(lián)起來,最后使用start()函數(shù)來開啟定時(shí)器。
下面添加timerUpdate()函數(shù)的定義:

void Widget::timerUpdate()
{
  //獲取系統(tǒng)現(xiàn)在的時(shí)間
  QDateTime time = QDateTime::currentDateTime();
  //設(shè)置系統(tǒng)時(shí)間顯示格式
  QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd");
  //在標(biāo)簽上顯示時(shí)間
  ui->lineEdit->setText(str);
}

    這里在行編輯器中顯示了當(dāng)前的時(shí)間?,F(xiàn)在可以運(yùn)行程序,查看效果。

二、隨機(jī)數(shù)

關(guān)于隨機(jī)數(shù),在Qt中是使用qrand()和qsrand()兩個(gè)函數(shù)實(shí)現(xiàn)的。在前面的程序中已經(jīng)看到了qrand()函數(shù)的使用,其可以產(chǎn)生隨機(jī)數(shù),qrand()%10可以產(chǎn)生0-9之間的隨機(jī)數(shù)。要想產(chǎn)生100以內(nèi)的隨機(jī)數(shù)就是%100。以此類推。
在使用qrand()函數(shù)產(chǎn)生隨機(jī)數(shù)之前,一般要使用qsrand()函數(shù)為其設(shè)置初值,如果不設(shè)置初值,那么每次運(yùn)行程序,qrand()都會(huì)產(chǎn)生相同的一組隨機(jī)數(shù)。為了每次運(yùn)行程序時(shí),都可以產(chǎn)生不同的隨機(jī)數(shù),我們要使用qsrand()設(shè)置一個(gè)不同的初值。這里使用了QTime類的secsTo()函數(shù),它表示兩個(gè)時(shí)間點(diǎn)之間所包含的秒數(shù),比如代碼中就是指從零點(diǎn)整到當(dāng)前時(shí)間所經(jīng)過的秒數(shù)。

下面先在widget.cpp的構(gòu)造函數(shù)中添加如下代碼:

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

然后在timerUpdate()函數(shù)的最后添加如下代碼:

int rand = qrand() % 300;      // 產(chǎn)生300以內(nèi)的正整數(shù)
ui->lineEdit->move(rand, rand);

這樣,每過一秒,行編輯器都會(huì)移動(dòng)到一個(gè)隨機(jī)的位置。大家可以運(yùn)行程序,查看效果。

以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。

上一篇:使用VS2010創(chuàng)建MFC ActiveX工程項(xiàng)目

欄    目:C語言

下一篇:Vc++ 控件List Control用法總結(jié)

本文標(biāo)題:Qt定時(shí)器和隨機(jī)數(shù)詳解

本文地址:http://www.jygsgssxh.com/a1/Cyuyan/3042.html

網(wǎng)頁制作CMS教程網(wǎng)絡(luò)編程軟件編程腳本語言數(shù)據(jù)庫服務(wù)器

如果侵犯了您的權(quán)利,請(qǐng)與我們聯(lián)系,我們將在24小時(shí)內(nèi)進(jìn)行處理、任何非本站因素導(dǎo)致的法律后果,本站均不負(fù)任何責(zé)任。

聯(lián)系QQ:835971066 | 郵箱:835971066#qq.com(#換成@)

Copyright © 2002-2020 腳本教程網(wǎng) 版權(quán)所有