




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
QT5開發(fā)及實(shí)例(第5版)第11章定時(shí)器、線程和DLL庫(kù)——定時(shí)器和線程01定時(shí)器:QTimer1.定時(shí)器用法2.定時(shí)器實(shí)例定時(shí)器:QTimer1.定時(shí)器用法如果要在應(yīng)用程序中周期性地進(jìn)行某項(xiàng)操作,則可以使用定時(shí)器。在Qt中提供有定時(shí)器QTimer類,此類的常用方法如表1所示,其常用信號(hào)如表2所示。方
法描
述start(n)啟動(dòng)或重啟定時(shí)器,時(shí)間間隔為n毫秒。如果定時(shí)器已經(jīng)運(yùn)行,它將被停止并重新啟動(dòng)。如果singleShot信號(hào)為真,定時(shí)器將僅被激活一次。stop()停止定時(shí)器。信
號(hào)描
述singleShot在給定的時(shí)間間隔后調(diào)用一個(gè)槽函數(shù)時(shí)發(fā)射此信號(hào)。timeout當(dāng)定時(shí)器超時(shí)時(shí)發(fā)射此信號(hào)。定時(shí)器:QTimer要使用定時(shí)器,首先引入QTimer庫(kù),創(chuàng)建一個(gè)QTimer對(duì)象,將其timeout信號(hào)連接到相應(yīng)的槽函數(shù),調(diào)用start(毫秒數(shù))設(shè)定時(shí)間間隔后啟動(dòng)定時(shí),定時(shí)器會(huì)以指定的時(shí)間間隔發(fā)出timeout信號(hào),執(zhí)行槽函數(shù)。例如:#include<QTimer>QTimer*timer=newQTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(槽函數(shù)()));timer->start(2000);......timer->stop();timer->singleShot(n,函數(shù)名);定時(shí)器:QTimer2.定時(shí)器實(shí)例【例】(簡(jiǎn)單)(CH1101)用QTimer動(dòng)態(tài)顯示系統(tǒng)時(shí)間。以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名timerTest,“ClassInformation”頁(yè)基類選“QWidget”。代碼如下(timerTest.cpp):Widget::Widget(QWidget*parent):QWidget(parent){setWindowTitle("QTimer應(yīng)用測(cè)試");label=newQLabel(this);label->setGeometry(20,20,180,60);timer=newQTimer(this);connect(timer,SIGNAL(timeout()),this,SLOT(showTime()));timer->start(1000);}......voidWidget::showTime(){QDateTimetime=QDateTime::currentDateTime(); //獲取當(dāng)前時(shí)間QStringtimeDisplay=time.toString("yyyy-MM-ddhh:mm:ssdddd"); //設(shè)置時(shí)間顯示label->setText(timeDisplay); //在標(biāo)簽上顯示時(shí)間}定時(shí)器:QTimer為了讓程序能夠定時(shí)自動(dòng)退出,在項(xiàng)目入口文件main.cpp中添加語(yǔ)句:intmain(intargc,char*argv[]){QApplicationa(argc,argv);Widgetw;w.show();
QTimer::singleShot(20000,&a,SLOT(quit())); //20秒退出應(yīng)用returna.exec();}其中,quit()為退出系統(tǒng)函數(shù)。運(yùn)行程序,顯示系統(tǒng)時(shí)間如圖。02線程:QThread1.線程用法2.線程實(shí)例線程:QThread1.線程用法Qt實(shí)現(xiàn)線程機(jī)制最核心的底層類是QThread,它的用法如下:(1)要開始一個(gè)線程,先創(chuàng)建QThread的一個(gè)子類,并重載QThread::run()函數(shù)。在自定義線程類頭文件中聲明,代碼如下:#include<QThread>class線程類:publicQThread{Q_OBJECT ...protected:voidrun(); //重載的函數(shù) ...};在自定義線程類源文件中重寫run()函數(shù),執(zhí)行線程相關(guān)代碼,如下:#include"頭文件"......void線程類::run(){//線程相關(guān)代碼......}線程:QThread(2)然后,在主程序中創(chuàng)建一個(gè)線程類的對(duì)象,并啟動(dòng):線程類*thread=new線程類();thread->start();線程啟動(dòng)之后,會(huì)自動(dòng)調(diào)用其實(shí)現(xiàn)的run()函數(shù),而線程要完成的任務(wù)就寫在run()函數(shù)中,當(dāng)run()函數(shù)執(zhí)行完畢退出之后線程基本也就結(jié)束了。QThread類中的常用方法如表。方
法描
述start()啟動(dòng)線程。wait(n)阻止線程,等待時(shí)間n的單位是毫秒。如果線程已完成執(zhí)行(從run()返回),返回true;如果線程尚未啟動(dòng),返回true;如果n是ULONG_MAX(默認(rèn)值),則等待,永遠(yuǎn)不會(huì)超時(shí)(線程必須從run()返回);如果等待超時(shí),將返回false。sleep(n)強(qiáng)制當(dāng)前線程睡眠n秒。msleep(n)強(qiáng)制當(dāng)前線程睡眠n毫秒。exit()退出線程事件循環(huán)并返回代碼。返回0表示成功,非0表示錯(cuò)誤。quit()退出線程事件循環(huán)并返回0(成功),相當(dāng)于exit():0。terminate()強(qiáng)制終止線程。setPriority(枚舉)設(shè)置線程優(yōu)先級(jí)。isFinished()判斷線程是否完成。isRunning()判斷線程是否正在運(yùn)行。線程:QThread其常用信號(hào)如表。信
號(hào)描
述started在開始執(zhí)行run()函數(shù)之前,從相關(guān)線程發(fā)射此信號(hào)。finished當(dāng)程序完成業(yè)務(wù)邏輯時(shí),從相關(guān)線程發(fā)射此信號(hào)。線程:QThread2.線程實(shí)例【例】(簡(jiǎn)單)(CH1102)QThread線程測(cè)試。以“直接編寫代碼”(即取消勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名threadTest,“ClassInformation”頁(yè)基類選“QWidget”。(1)先基于QThread創(chuàng)建自定義的線程類。在項(xiàng)目中添加C++類Worker繼承自QThread,類的具體信息設(shè)置如圖。線程:QThread(2)實(shí)現(xiàn)線程任務(wù)在線程類頭文件worker.h中定義信號(hào)和聲明線程run()函數(shù),如下:#ifndefWORKER_H#defineWORKER_H#include<QThread>#include<QDateTime>classWorker:publicQThread{Q_OBJECTpublic:Worker();signals:voidstrOutSignal(QString); //定義信號(hào)protected:voidrun(); //線程run()函數(shù)private:boolworking;};#endif//WORKER_H線程:QThread在線程類源文件worker.cpp中編寫run()函數(shù)的代碼,完成要線程執(zhí)行的任務(wù),如下:#include"worker.h"Worker::Worker(){working=true;}voidWorker::run(){while(working){QDateTimetime=QDateTime::currentDateTime();QStringtimeStr=time.toString("yyyy-MM-ddhh:mm:ssdddd");emitstrOutSignal(timeStr); //發(fā)出信號(hào)sleep(1); //線程休眠1秒}}線程:QThread(3)主程序使用線程開發(fā)好線程類之后,就可以在主程序中直接使用線程來(lái)完成相應(yīng)的任務(wù)。先在主程序頭文件threadTest.h中聲明槽函數(shù)和引用線程對(duì)象的指針,如下:#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#include<QListWidget>#include<QPushButton>#include<QGridLayout>#include"worker.h"classWidget:publicQWidget{Q_OBJECTpublic:Widget(QWidget*parent=nullptr);~Widget();privateslots:voidthreadStart(); //啟動(dòng)線程voidlistStrAdd(QStringstrInf); //接收線程信號(hào)執(zhí)行加入當(dāng)前時(shí)間字符串到列表中private:QListWidget*listStr;QPushButton*pbStart;Worker*thread; //引用線程對(duì)象的指針};#endif//WIDGET_H線程:QThread最后,再在主程序源文件threadTest.cpp中創(chuàng)建線程對(duì)象,并啟動(dòng)它來(lái)完成任務(wù)。運(yùn)行程序,單擊“開始”按鈕,每隔1秒顯示一次系統(tǒng)時(shí)間,如圖。QT5開發(fā)及實(shí)例(第5版)第11章定時(shí)器、線程和DLL庫(kù)——Qt程序開發(fā)和調(diào)用DLL庫(kù)Qt程序開發(fā)和調(diào)用DLL庫(kù)【例】(難度一般)(CH1103)運(yùn)動(dòng)健身減肥已成為現(xiàn)代人的生活時(shí)尚,開發(fā)一個(gè)“健康計(jì)算器”計(jì)算體脂率(BFR)、判斷體態(tài),用于身材管理,界面如圖。01開發(fā)DLL庫(kù)1.創(chuàng)建C++庫(kù)項(xiàng)目2.編寫導(dǎo)出函數(shù)(接口)3.生成DLL開發(fā)DLL庫(kù)1.創(chuàng)建C++庫(kù)項(xiàng)目(1)運(yùn)行QtCreator,在歡迎界面左側(cè)點(diǎn)“CreateProject...”按鈕,或者選擇“文件”→“NewProject...”命令,在出現(xiàn)的“NewProject”窗口選擇項(xiàng)目模板。點(diǎn)左欄“Projects”列表下的“Library”,中間欄選“C++Library”選項(xiàng),如圖。開發(fā)DLL庫(kù)(2)命名項(xiàng)目并選擇保存路徑。這里將項(xiàng)目命名為BFRCalculator,如圖,單擊“下一步”按鈕進(jìn)入下一步驟。(3)接下來(lái)的界面讓用戶選擇項(xiàng)目的構(gòu)建(編譯)工具,選qmake,單擊“下一步”按鈕。開發(fā)DLL庫(kù)(4)在“DefineProjectDetails”頁(yè)的“Type”欄選擇“SharedLibrary”(共享庫(kù));“Qtmodule”欄選擇“Core”;并根據(jù)需要重命名頭文件和源文件,如圖。開發(fā)DLL庫(kù)2.編寫導(dǎo)出函數(shù)(接口)(1)在頭文件BfrCalculator.h中聲明導(dǎo)出函數(shù)getBfr,如下:#ifndefBFRCALCULATOR_H#defineBFRCALCULATOR_H
#include"BFRCalculator_global.h"
classBFRCALCULATOR_EXPORTBFRCalculator{public:BFRCalculator();};
#endif//BFRCALCULATOR_H
extern"C"{BFRCALCULATOR_EXPORTfloatgetBfr(floatbmi,intage,intsex);}開發(fā)DLL庫(kù)(2)在源文件BfrCalculator.cpp中編寫導(dǎo)出函數(shù)getBfr,根據(jù)傳入?yún)?shù)實(shí)現(xiàn)對(duì)BFR值的計(jì)算,代碼如下:#include"BfrCalculator.h"
BFRCalculator::BFRCalculator(){}
floatgetBfr(floatbmi,intage,intsex){floatbfr=1.2*bmi+0.23*age-5.4-10.8*sex;returnbfr;}開發(fā)DLL庫(kù)3.生成DLL選擇主菜單“構(gòu)建”→“構(gòu)建項(xiàng)目"BFRCalculator"”,執(zhí)行后在項(xiàng)目debug目錄下生成了幾個(gè)文件,如圖。02使用DLL庫(kù)1.創(chuàng)建Qt項(xiàng)目2.設(shè)計(jì)界面3.添加DLL4.程序調(diào)用DLL使用DLL庫(kù)1.創(chuàng)建Qt項(xiàng)目以“設(shè)計(jì)器QtDesigner”(要勾選“Generateform”復(fù)選框)方式創(chuàng)建Qt項(xiàng)目,項(xiàng)目名BFRApp,“ClassInformation”頁(yè)基類選“QWidget”。在項(xiàng)目中新建一個(gè)image目錄,將程序要用的圖片資源icon.jpg、bg.jpg存放在該目錄下。2.設(shè)計(jì)界面在項(xiàng)目樹形視圖中雙
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 城市地下綜合管廊建設(shè)改造工程實(shí)施方案
- 2025至2030年中國(guó)多媒體教學(xué)網(wǎng)產(chǎn)品行業(yè)投資前景及策略咨詢研究報(bào)告
- 2025至2030年AD3項(xiàng)目投資價(jià)值分析報(bào)告
- 2025年鋁土礦項(xiàng)目可行性研究報(bào)告
- 2025年軟木卷紙項(xiàng)目可行性研究報(bào)告
- 名師工作室評(píng)價(jià)與反饋機(jī)制計(jì)劃
- 2025年機(jī)繡花套衫項(xiàng)目可行性研究報(bào)告
- 2025-小學(xué)德育創(chuàng)新教育實(shí)踐計(jì)劃
- 四年級(jí)第一學(xué)期學(xué)科競(jìng)賽工作計(jì)劃
- 工業(yè)廢水處理技術(shù)改造升級(jí)項(xiàng)目補(bǔ)充協(xié)議書
- 2025年工程管理試題及答案
- 《電纜狀態(tài)監(jiān)測(cè)》課件
- 神經(jīng)鞘瘤MRI診斷要點(diǎn)及鑒別診斷課件
- 青梅綠茶測(cè)試題及答案
- GA 1812.2-2024銀行系統(tǒng)反恐怖防范要求第2部分:數(shù)據(jù)中心
- 法治護(hù)航成長(zhǎng)路-四年級(jí)法制教育專題
- 聯(lián)鎖系統(tǒng)設(shè)備調(diào)試施工作業(yè)指導(dǎo)書
- 國(guó)家職業(yè)技術(shù)技能標(biāo)準(zhǔn) 6-31-01-03 電工 人社廳發(fā)2018145號(hào)
- 2024《整治形式主義為基層減負(fù)若干規(guī)定》全文課件
- DZ∕T 0227-2010 地質(zhì)巖心鉆探規(guī)程(正式版)
- 國(guó)有企業(yè)合規(guī)管理
評(píng)論
0/150
提交評(píng)論