Qt定時器和隨機(jī)數(shù)詳解
環(huán)境是:Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1
一、定時器
Qt中有兩種方法來使用定時器,一種是定時器事件,另一種是使用信號和槽。一般使用了多個定時器時最好使用定時器事件來處理。
1.新建Qt Gui應(yīng)用,項目名稱為myTimer,基類選擇QWidget,類名為Widget。
2.到widget.h文件中添加函數(shù)聲明:
protected:
void timerEvent(QTimerEvent *);
然后添加私有變量定義:
int id1, id2, id3;
3.下面到設(shè)計模式,向界面上拖入兩個標(biāo)簽部件Label。
4.下面進(jìn)入widget.cpp文件,先在構(gòu)造函數(shù)中添加如下代碼:
id1 = startTimer(1000); // 開啟一個1秒定時器,返回其ID id2 = startTimer(2000); id3 = startTimer(10000);
這里開啟了三個定時器,分別返回了它們的id,這個id用來區(qū)分不同的定時器。定時器的時間單位是毫秒。每當(dāng)一個定時器溢出時,都會調(diào)用定時器事件處理函數(shù),我們可以在該函數(shù)中進(jìn)行相應(yīng)的處理。
5.下面添加定時器事件處理函數(shù)的定義:
void Widget::timerEvent(QTimerEvent *event) { if (event->timerId() == id1) { // 判斷是哪個定時器 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ù)返回了溢出的定時器的id,然后根據(jù)該id來判斷是哪個定時器溢出了,并進(jìn)行相應(yīng)的處理。每當(dāng)?shù)谝粋€定時器溢出時都產(chǎn)生一個小于10的隨機(jī)數(shù);當(dāng)?shù)诙€定時器溢出時,就更改標(biāo)簽的文本;當(dāng)?shù)谌齻€定時器溢出時則退出應(yīng)用程序?,F(xiàn)在可以運行程序,查看效果。
6.如果只是想開啟少量的定時器,也可以使用信號和槽來實現(xiàn)。
先在widget.h中添加一個私有槽聲明:
private slots: void timerUpdate();
然后到設(shè)計模式向界面上添加一個行編輯器部件Line Edit,再到widget.cpp中添加頭文件包含:
#include <QTimer> #include <QDateTime>
然后在構(gòu)造函數(shù)中添加如下代碼:
QTimer *timer = new QTimer(this); //關(guān)聯(lián)定時器溢出信號和相應(yīng)的槽函數(shù) connect(timer, SIGNAL(timeout()), this, SLOT(timerUpdate())); timer->start(1000);
這里創(chuàng)建了一個定時器,并將其溢出信號和更新槽關(guān)聯(lián)起來,最后使用start()函數(shù)來開啟定時器。
下面添加timerUpdate()函數(shù)的定義:
void Widget::timerUpdate() { //獲取系統(tǒng)現(xiàn)在的時間 QDateTime time = QDateTime::currentDateTime(); //設(shè)置系統(tǒng)時間顯示格式 QString str = time.toString("yyyy-MM-dd hh:mm:ss dddd"); //在標(biāo)簽上顯示時間 ui->lineEdit->setText(str); }
這里在行編輯器中顯示了當(dāng)前的時間。現(xiàn)在可以運行程序,查看效果。
二、隨機(jī)數(shù)
關(guān)于隨機(jī)數(shù),在Qt中是使用qrand()和qsrand()兩個函數(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è)置初值,那么每次運行程序,qrand()都會產(chǎn)生相同的一組隨機(jī)數(shù)。為了每次運行程序時,都可以產(chǎn)生不同的隨機(jī)數(shù),我們要使用qsrand()設(shè)置一個不同的初值。這里使用了QTime類的secsTo()函數(shù),它表示兩個時間點之間所包含的秒數(shù),比如代碼中就是指從零點整到當(dāng)前時間所經(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);
這樣,每過一秒,行編輯器都會移動到一個隨機(jī)的位置。大家可以運行程序,查看效果。
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
上一篇:使用VS2010創(chuàng)建MFC ActiveX工程項目
欄 目:C語言
下一篇:Vc++ 控件List Control用法總結(jié)
本文標(biāo)題:Qt定時器和隨機(jī)數(shù)詳解
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/3042.html
您可能感興趣的文章
- 01-10求子數(shù)組最大和的解決方法詳解
- 01-10生成隨機(jī)數(shù)rand函數(shù)的用法詳解
- 01-10用C實現(xiàn)添加和讀取配置文件函數(shù)
- 01-10深入串的模式匹配算法(普通算法和KMP算法)的詳解
- 01-10如何求連續(xù)幾個數(shù)之和的最大值
- 01-10C++產(chǎn)生隨機(jī)數(shù)的實現(xiàn)代碼
- 01-10如何在二叉樹中找出和為某一值的所有路徑
- 01-10用代碼和UML圖化解設(shè)計模式之橋接模式的深入分析
- 01-10C語言中字符串和數(shù)字的相互轉(zhuǎn)換實現(xiàn)代碼
- 01-10淺析C語言中printf(),sprintf(),scanf(),sscanf()的用法和區(qū)別


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-10C#中split用法實例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子