Qt定時(shí)器和隨機(jī)數(shù)詳解
環(huán)境是:Windows 7 + Qt 4.8.1 +Qt Creator 2.4.1
一、定時(shí)器
Qt中有兩種方法來(lái)使用定時(shí)器,一種是定時(shí)器事件,另一種是使用信號(hào)和槽。一般使用了多個(gè)定時(shí)器時(shí)最好使用定時(shí)器事件來(lái)處理。
1.新建Qt Gui應(yīng)用,項(xiàng)目名稱(chēng)為myTimer,基類(lèi)選擇QWidget,類(lèi)名為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); // 開(kāi)啟一個(gè)1秒定時(shí)器,返回其ID id2 = startTimer(2000); id3 = startTimer(10000);
這里開(kāi)啟了三個(gè)定時(shí)器,分別返回了它們的id,這個(gè)id用來(lái)區(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來(lái)判斷是哪個(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)用程序。現(xiàn)在可以運(yùn)行程序,查看效果。
6.如果只是想開(kāi)啟少量的定時(shí)器,也可以使用信號(hào)和槽來(lái)實(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)起來(lái),最后使用start()函數(shù)來(lái)開(kāi)啟定時(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以?xún)?nèi)的隨機(jī)數(shù)就是%100。以此類(lèi)推。
在使用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類(lèi)的secsTo()函數(shù),它表示兩個(gè)時(shí)間點(diǎn)之間所包含的秒數(shù),比如代碼中就是指從零點(diǎn)整到當(dāng)前時(shí)間所經(jīng)過(guò)的秒數(shù)。
下面先在widget.cpp的構(gòu)造函數(shù)中添加如下代碼:
qsrand(QTime(0, 0, 0).secsTo(QTime::currentTime()));
然后在timerUpdate()函數(shù)的最后添加如下代碼:
int rand = qrand() % 300; // 產(chǎn)生300以?xún)?nèi)的正整數(shù) ui->lineEdit->move(rand, rand);
這樣,每過(guò)一秒,行編輯器都會(huì)移動(dòng)到一個(gè)隨機(jī)的位置。大家可以運(yùn)行程序,查看效果。
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
vscode配置遠(yuǎn)程開(kāi)發(fā)環(huán)境并遠(yuǎn)程調(diào)試運(yùn)行C++代碼的教程
這篇文章主要介紹了vscode配置遠(yuǎn)程開(kāi)發(fā)環(huán)境并遠(yuǎn)程調(diào)試運(yùn)行C++代碼的教程,本文通過(guò)截圖實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04
C語(yǔ)言學(xué)習(xí)進(jìn)階篇之萬(wàn)字詳解指針與qsort函數(shù)
之前的指針詳解中,提到過(guò)qsort函數(shù),這個(gè)函數(shù)是用來(lái)排序的,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言指針與qsort函數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08
C語(yǔ)言實(shí)現(xiàn)車(chē)輛出租管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)車(chē)輛出租管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
VC6.0如何創(chuàng)建以及調(diào)用動(dòng)態(tài)鏈接庫(kù)實(shí)例詳解
作為客戶與后臺(tái)的中介,為了更好的調(diào)節(jié)兩方的關(guān)系,我明智滴選擇了webservice以及動(dòng)態(tài)鏈接庫(kù)。在與客戶c++使動(dòng)態(tài)鏈接庫(kù)方式,而與后臺(tái)java,使用webservice來(lái)交流溝通2013-01-01
形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用, 離開(kāi)該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用,形參和實(shí)參的功能是作數(shù)據(jù)傳送。發(fā)生函數(shù)調(diào)用時(shí), 主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送2021-11-11
C++語(yǔ)言編寫(xiě)寫(xiě)日志類(lèi)
這篇文章主要介紹了C++語(yǔ)言編寫(xiě)寫(xiě)日志類(lèi)的相關(guān)資料,支持寫(xiě)日志級(jí)別設(shè)置、支持多線程、支持可變形參表寫(xiě)日志,需要的朋友可以參考下2015-12-12

