




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
智能家居平臺(tái)應(yīng)用項(xiàng)目化教程第3章環(huán)境監(jiān)測(cè)相關(guān)知識(shí)介紹項(xiàng)目實(shí)施實(shí)訓(xùn)項(xiàng)目2項(xiàng)目描述項(xiàng)目描述3項(xiàng)目描述環(huán)境監(jiān)測(cè)作為智能家居應(yīng)用的重要基礎(chǔ)功能,其主要用于獲取各傳感器采集的實(shí)時(shí)數(shù)據(jù),并通過(guò)預(yù)處理將其展示在應(yīng)用界面中。其中傳感器類(lèi)別主要包括溫度傳感器、濕度傳感器、光照傳感器和CO2傳感器等,這些傳感器協(xié)調(diào)工作,將自然界中的各類(lèi)非電信號(hào)轉(zhuǎn)化成電信號(hào),讓用戶(hù)能夠全面直觀的了解其周?chē)纳瞽h(huán)境。4相關(guān)知識(shí)介紹5相關(guān)知識(shí)介紹信號(hào)和槽是一種高級(jí)接口,應(yīng)用于對(duì)象之間的通信,它是Qt的核心特性,也是Qt區(qū)別于其它工具包的重要地方。信號(hào)和槽是Qt自行定義的一種通信機(jī)制,它獨(dú)立于標(biāo)準(zhǔn)的C/C++語(yǔ)言,因此要正確的處理信號(hào)和槽,必須借助一個(gè)稱(chēng)為moc(MetaObjectCompiler)的Qt工具,該工具是一個(gè)C++預(yù)處理程序,它為高層次的事件處理自動(dòng)生成所需要的附加代碼。Qt支持將很多信號(hào)與單個(gè)的槽進(jìn)行連接,也可以將單個(gè)的信號(hào)與很多的槽進(jìn)行連接,甚至于將一個(gè)信號(hào)與另外一個(gè)信號(hào)相連接也是可能的,這時(shí)無(wú)論第一個(gè)信號(hào)什么時(shí)候發(fā)射,系統(tǒng)都將立刻發(fā)射第二個(gè)信號(hào)??傊?,信號(hào)與槽構(gòu)造了一個(gè)強(qiáng)大的部件編程機(jī)制。6信號(hào)槽相關(guān)知識(shí)介紹信號(hào)在Qt中使用信號(hào)時(shí)有以下幾點(diǎn)注意事項(xiàng):聲明一個(gè)信號(hào)需要使用signals關(guān)鍵字做標(biāo)識(shí)符,同時(shí)在signals關(guān)鍵字前面不允許出現(xiàn)public、private和protected等限定符。信號(hào)只是用作聲明,因此在代碼中不需要對(duì)其進(jìn)行定義和實(shí)現(xiàn)。信號(hào)沒(méi)有返回值,只能是void類(lèi)型。使用信號(hào)槽時(shí)必須在類(lèi)聲明的最開(kāi)始處添加Q_OBJECT宏。信號(hào)由moc自動(dòng)產(chǎn)生,它們不應(yīng)該在.cpp文件中實(shí)現(xiàn)。例如,下面定義了三個(gè)信號(hào):signals:voidmySignal();voidmySignal(intx);voidmySignalParam(intx,inty);7信號(hào)槽相關(guān)知識(shí)介紹槽槽是普通的C++成員函數(shù),其可以被正常調(diào)用,它們唯一的特殊性就是很多信號(hào)可以與其相關(guān)聯(lián)。當(dāng)與其關(guān)聯(lián)的信號(hào)被發(fā)射時(shí),這個(gè)槽就會(huì)被調(diào)用。槽可以有參數(shù),但槽的參數(shù)不能有缺省值。同普通的C++成員函數(shù)一樣,槽函數(shù)也分為三種類(lèi)型,即publicslots、privateslots和protectedslots:publicslots:在這個(gè)區(qū)內(nèi)聲明的槽意味著任何對(duì)象都可將信號(hào)與之相連接。這對(duì)于組件編程非常有用,開(kāi)發(fā)者可以根據(jù)需要?jiǎng)?chuàng)建彼此互不了解的對(duì)象,將它們的信號(hào)與槽進(jìn)行連接以便信息能夠正確的傳遞。protectedslots:在這個(gè)區(qū)內(nèi)聲明的槽意味著當(dāng)前類(lèi)及其子類(lèi)可以將信號(hào)與之相連接。這適用屬于類(lèi)實(shí)現(xiàn)的一部分,但是其界面接口卻面向外部的槽。privateslots:在這個(gè)區(qū)內(nèi)聲明的槽意味著只有類(lèi)自己可以將信號(hào)與之相連接。這適用于聯(lián)系非常緊密的類(lèi)。8信號(hào)槽相關(guān)知識(shí)介紹槽槽也能夠聲明為虛函數(shù),這也是非常有用的。槽的聲明也是在頭文件中進(jìn)行的。例如,下面聲明了三個(gè)槽:publicslots:voidmySlot();voidmySlot(intx);voidmySignalParam(intx,inty);9信號(hào)槽相關(guān)知識(shí)介紹信號(hào)與槽的連接所有從QObject或其子類(lèi)(例如Qwidget)派生的類(lèi)都能夠包含信號(hào)和槽。因?yàn)樾盘?hào)與槽的連接是通過(guò)QObject的connect()成員函數(shù)來(lái)實(shí)現(xiàn)的。其代碼使用如下:connect(sender,SIGNAL(signal),receiver,SLOT(slot));其中sender與receiver是指向?qū)ο蟮闹羔?,SIGNAL()與SLOT()是轉(zhuǎn)換信號(hào)與槽的宏。10信號(hào)槽相關(guān)知識(shí)介紹11QComboBox函數(shù)說(shuō)明voidaddItems(constQStringList&texts)在QComboBox的最后添加一項(xiàng),其中texts參數(shù)便是添加的內(nèi)容。intcount()const返回列表項(xiàng)總數(shù)。intcurrentIndex()const當(dāng)前顯示的列表項(xiàng)序號(hào)。QStringcurrentText()const返回當(dāng)前顯示的文本。voidinsertItems(intindex,constQStringList&list)插入一項(xiàng)或多項(xiàng)內(nèi)容至序號(hào)index處。voidinsertSeparator(intindex)在序號(hào)為index的項(xiàng)前插入分隔線。voidsetItemText(intindex,constQString&text)改變序號(hào)為index項(xiàng)的文本。ComboBox是QTGUI中的下拉列表框,它用于顯示特定字段的可能值列表,當(dāng)單擊該控件時(shí)會(huì)顯示與該字段關(guān)聯(lián)的值列表,用戶(hù)可選擇其中的一個(gè)值。QComboBox類(lèi)具有如下表所示的常用方法和屬性,運(yùn)行效果如下圖所示:項(xiàng)目實(shí)施12項(xiàng)目實(shí)施環(huán)境監(jiān)測(cè)作為智能家居應(yīng)用中的重要功能之一,其主要是利用諸如溫度傳感器、濕度傳感器、光照傳感器和CO2傳感器等協(xié)調(diào)工作,將自然界中的各類(lèi)非電信號(hào)轉(zhuǎn)化成電信號(hào),讓用戶(hù)能夠全面直觀的了解其周?chē)纳瞽h(huán)境。通過(guò)本項(xiàng)目的完成,使學(xué)生可以掌握以下技能:能夠完成功能界面的合理布局;能夠理解并靈活使用信號(hào)槽及QComboBox控件;能夠利用代碼實(shí)現(xiàn)環(huán)境數(shù)據(jù)的實(shí)時(shí)監(jiān)測(cè)功能;能夠通過(guò)調(diào)試解決代碼的錯(cuò)誤提示并保證正常編譯運(yùn)行。13方案設(shè)計(jì)和項(xiàng)目目標(biāo)項(xiàng)目實(shí)施在上一章的工程項(xiàng)目基礎(chǔ)上添加SerialThread類(lèi),其步驟如下:(1)鼠標(biāo)右擊SmartHome項(xiàng)目,在彈出的工具欄中選擇“添加新文件”,如右圖所示。(2)點(diǎn)擊“添加新文件”后在彈出的“新建文件”對(duì)話框中選擇“C++類(lèi)”,隨后單擊“選擇”按鈕,如右圖所示。14添加C++類(lèi)文件項(xiàng)目實(shí)施(3)在彈出的“C++類(lèi)向?qū)А苯缑嬷械念?lèi)名對(duì)話框輸入SerialThread,在基類(lèi)對(duì)話框中輸入QThread,其界面如右圖所示,完成后單擊“下一步”。(4)在彈出的“項(xiàng)目管理”界面單擊“完成”按鈕,至此C++類(lèi)的添加便已完成,如右圖所示。15添加C++類(lèi)文件項(xiàng)目實(shí)施(5)修改serialthread.h頭文件,在其首部引入其它功能的頭文件,以此實(shí)現(xiàn)功能模塊之間的交互,因此在代碼#include<QThread>下一行寫(xiě)入如下代碼:#include"posix_qextserialport.h"http://導(dǎo)入串口支持類(lèi)頭文件(6)隨后在以上代碼的下一行聲明zhi[3]和ttys兩個(gè)全局變量,其代碼和注釋如下所示:externintzhi[3];//用數(shù)組存儲(chǔ)界面上QComboBox選擇的參數(shù)externQStringttys;//用于存儲(chǔ)與服務(wù)端進(jìn)行數(shù)據(jù)交換的端口號(hào)16添加C++類(lèi)文件項(xiàng)目實(shí)施(7)在classSerialThread:publicQThread函數(shù)的public中聲明Posix_QextSerialPort類(lèi)實(shí)例化的變量,同時(shí)在signals:中編寫(xiě)信號(hào)函數(shù),其詳細(xì)代碼如下所示:public:explicitSerialThread();Posix_QextSerialPort*m;//實(shí)例化串口類(lèi)
voidrun();signals:voidserialFinished(QByteArraystr);//信號(hào)函數(shù),str用于串口返回來(lái)的數(shù)據(jù)(8)打開(kāi)源文件serialthread.cpp,對(duì)頭文件serialthread.h中聲明的zhi[3]和ttys兩個(gè)全局變量進(jìn)行初始化,其位置處于#include"serialthread.h"下一行,具體代碼如下:intzhi[3]={0,0,0};QStringttys="";17添加C++類(lèi)文件項(xiàng)目實(shí)施(9)在函數(shù)SerialThread::SerialThread()中輸入功能代碼,其主要用于實(shí)現(xiàn)串口數(shù)據(jù)交換的配置,具體代碼如下:
structPortSettingstty;//實(shí)例化串口,并對(duì)其進(jìn)行配置
m=newPosix_QextSerialPort("/dev/"+ttys,tty,QextSerialBase::Polling);//定義串口對(duì)象,指定串口名和查詢(xún)模式
m->open(QIODevice::ReadWrite);//設(shè)置串口讀寫(xiě)
m->setBaudRate(BaudRateType(zhi[0]));//設(shè)置波特率
m->setDataBits(DataBitsType(zhi[2]));//設(shè)置數(shù)據(jù)位
m->setFlowControl(FLOW_OFF);//數(shù)據(jù)流控制設(shè)置
m->setParity(ParityType(zhi[1]));//設(shè)置校驗(yàn)位
m->setStopBits(STOP_1);//設(shè)置停止位
m->setTimeout(70);//延時(shí)設(shè)置18添加C++類(lèi)文件項(xiàng)目實(shí)施(10)在程序尾部插入頭文件serialthread.h中run()函數(shù)的具體功能實(shí)現(xiàn),代碼如下:voidSerialThread::run(){while(1){//對(duì)比40ms前后收到的兩段數(shù)據(jù),一直的話即讀取數(shù)據(jù)
intlen=m->bytesAvailable();//把接收到的包賦值
msleep(40);//延遲40msif(len==m->bytesAvailable())//判斷接受到的包是否一致
{QByteArrayt=m->readAll();//讀取串口緩沖區(qū)的所有數(shù)據(jù)給臨時(shí)變量temitthis->serialFinished(t);//把serialFinished信號(hào)發(fā)射出去
}}}19添加C++類(lèi)文件項(xiàng)目實(shí)施TabWidget控件對(duì)上一章中的界面文件smart.ui進(jìn)行設(shè)計(jì),使用TabWidget控件將其分成四個(gè)功能模塊,分別是環(huán)境監(jiān)測(cè)、家電控制、自動(dòng)控制和數(shù)據(jù)可視,因此本部分界面中主要需要注意TabWidget和ComboBox兩個(gè)控件。其中TabWidge控件的詳細(xì)使用方法如下:(1)選擇找到界面文件,在本項(xiàng)目中以smart.ui為例。雙擊“smart.ui”文件,進(jìn)入圖形化界面設(shè)計(jì)窗體,在窗體的左側(cè)的Containers欄找到TabWidget圖標(biāo),如右圖所示。TabWidget就是Qt開(kāi)發(fā)中用于頁(yè)面切換的控件。20修改界面布局項(xiàng)目實(shí)施(2)選中TabWidget圖標(biāo),將它拖拽至界面中,就成功地在界面中添加了一個(gè)頁(yè)面切換控件了。此時(shí)可以將TabWidget中的文本修改成符合項(xiàng)目需求的文本了,在此處就以“環(huán)境監(jiān)測(cè)”為例。點(diǎn)擊剛剛拖出來(lái)的TabWidget中的需修改文本的某一頁(yè),在右側(cè)的屬性欄中找到currentTabText屬性,在其中輸入文本“環(huán)境監(jiān)測(cè)”即可,如圖所示。21修改界面布局項(xiàng)目實(shí)施(3)為了在項(xiàng)目以后的開(kāi)發(fā)過(guò)程中,避免控件太多導(dǎo)致的混淆,就需要修改控件的名稱(chēng),在右上角的控件列表中找到這個(gè)TabWidget,修改它的名稱(chēng),在此處就以SmartHome為例,如左圖所示。如果為了修改其中某一頁(yè)面的控件名稱(chēng),只需按照上述方法將TabWidget下面的該頁(yè)面的名稱(chēng)修改即可,此處以第一個(gè)“環(huán)境監(jiān)測(cè)”界面為例,將其名稱(chēng)修改為Environment,修改后的界面如右圖所示。22修改界面布局項(xiàng)目實(shí)施(4)如果要在當(dāng)前頁(yè)面的基礎(chǔ)上繼續(xù)增加頁(yè)面,則只需單擊最后一個(gè)頁(yè)面,隨后鼠標(biāo)選擇“插入頁(yè)”,并在右邊工具欄點(diǎn)擊“在當(dāng)前頁(yè)之后”,如左圖所示。插入頁(yè)面的結(jié)果如右圖所示,后續(xù)具體操作只需重復(fù)上述步驟即可。23修改界面布局項(xiàng)目實(shí)施ComboBox控件對(duì)于ComboBox控件的使用方法如下:(1)選擇找到界面文件,在本項(xiàng)目中以smart.ui為例。雙擊“smart.ui”文件,進(jìn)入圖形化界面設(shè)計(jì)窗體,在窗體的左側(cè)的InputWidgets欄找到ComboBox圖標(biāo),如圖右所示。ComboBox就是Qt開(kāi)發(fā)中的組合框,這個(gè)控件是由一個(gè)文本輸入控件和一個(gè)下拉菜單組成的,可以節(jié)省空間。24修改界面布局項(xiàng)目實(shí)施(2)選中ComboBox圖標(biāo),將它拖拽至界面中,就成功地在界面中添加了一個(gè)組合框了。此時(shí)可以在ComboBox中添加符合項(xiàng)目需求的文本了,在此處就以“光照”為例。雙擊剛剛拖出來(lái)的ComboBox控件,在彈出的“編輯組合框”中點(diǎn)擊加號(hào)按鈕,及新建文件按鈕,如圖所示。25修改界面布局項(xiàng)目實(shí)施(3)在新建的文本框中輸入“關(guān)照”,隨后按照此方法依次添加所需項(xiàng)目,最后單擊“確定”完成組合框選項(xiàng)設(shè)置,如右圖所示。(4)為了在項(xiàng)目以后的開(kāi)發(fā)過(guò)程中,避免控件太多導(dǎo)致的混淆,就需要修改控件的名稱(chēng),在右上角的控件列表中找到這個(gè)ComboBox,修改它的名稱(chēng),在此處就以comboBox為例,如右圖所示。26修改界面布局項(xiàng)目實(shí)施對(duì)主界面文件smart.ui進(jìn)行重新設(shè)計(jì),其界面布局效果圖如圖所示:27修改界面布局項(xiàng)目實(shí)施控件的詳細(xì)信息如表所示:28修改界面布局控件ID控件類(lèi)別控件內(nèi)容labelQLabel服務(wù)器IP:label_2QLabel端口號(hào)::label_3QLabel串口號(hào):label_4QLabel波特率:label_5QLabel校驗(yàn)位:label_6QLabel數(shù)據(jù)位:label_7QLabel監(jiān)測(cè)對(duì)象:label_8QLabel溫度:label_9QLabel濕度:label_10QLabel人體:label_11QLabel光照:label_12QLabel煙霧:label_13QLabel燃?xì)?label_14QLabel氣壓:label_15QLabelPM2.5label_16QLabelCO2:lbServerIPQLabel0.0.0.0lbPortQLabel0控件ID控件類(lèi)別控件內(nèi)容lbTempQLabel0lbHumidityQLabel0lbRTQLabel無(wú)人lbIllQLabel0lbSmokeQLabel0lbGasQLabel0lbAirQLabel0lbPM25QLabel0lbCo2QLabel0cbPortQComboBoxttyUSB0cbBaudQComboBox9600cbFlowQComboBox偶校驗(yàn)cbDataQComboBox8cbQJQComboBox光照btnLinkQPushButton打開(kāi)串口btnLinkServerQPushButton連接服務(wù)器btnListenQPushButton監(jiān)聽(tīng)btnCloseQPushButtonleMaxQLineEdit最大值:項(xiàng)目實(shí)施
環(huán)境監(jiān)測(cè)功能主要是用于實(shí)時(shí)讀取傳感器采集的環(huán)境參數(shù),并利用數(shù)值的形式展示給用戶(hù),使其對(duì)周?chē)h(huán)境有一個(gè)量化的了解。該模塊功能主要由頭文件smart.h和源文件smart.cpp實(shí)現(xiàn)。其中smart.h的具體編寫(xiě)步驟如下:(1)打開(kāi)頭文件smart.h并修改,在其首部引入其它功能的頭文件,以此實(shí)現(xiàn)功能模塊之間的交互,因此在代碼#include<QDialog>下一行寫(xiě)入如下代碼:#include"login.h"http://導(dǎo)入登錄功能頭文件#include"command.h"http://導(dǎo)入?yún)?shù)命令頭文件#include"configure.h"http://導(dǎo)入配置功能頭文件#include"log.h"http://導(dǎo)入日志功能頭文件#include"sql.h"http://導(dǎo)入數(shù)據(jù)庫(kù)功能頭文件#include"tcpclientthread.h"http://導(dǎo)入環(huán)境參數(shù)傳遞至服務(wù)器操作的客戶(hù)端線程類(lèi)頭文件#include"tcpserver.h"http://導(dǎo)入網(wǎng)絡(luò)服務(wù)端類(lèi)頭文件29修改環(huán)境監(jiān)測(cè)功能頭文件和源文件項(xiàng)目實(shí)施30修改環(huán)境監(jiān)測(cè)功能頭文件和源文件(2)隨后在以上代碼的下一行聲明各環(huán)境參數(shù)的全局變量,其代碼如下所示:externQStringIllumination_Value;//光照度externQStringTemp_Value;//溫度值externQStringHumidity_Value;//濕度值externQStringCO2_Value;//CO2externQStringAirPressure_Value;//氣壓externQStringSmoke_Value;//煙霧externQStringGas_Value;//燃?xì)鈋xternQStringPM25_Value;//PM2.5externvolatileunsignedintStateHumanInfrared;//人體紅外,1:有人。0:無(wú)人externvolatileunsignedintconfigboardnumberAir;externvolatileunsignedintconfigboardnumberCo2;項(xiàng)目實(shí)施31修改環(huán)境監(jiān)測(cè)功能頭文件和源文件externvolatileunsignedintconfigboardnumberCurtain;externvolatileunsignedintconfigboardnumberFan;externvolatileunsignedintconfigboardnumberGasSensor;externvolatileunsignedintconfigboardnumberHumanInfrared;externvolatileunsignedintconfigboardnumberHumidity;externvolatileunsignedintconfigboardnumberIllumination;externvolatileunsignedintconfigboardnumberInfrared;externvolatileunsignedintconfigboardnumberLamp;externvolatileunsignedintconfigboardnumberPM25;externvolatileunsignedintconfigboardnumberRFID;externvolatileunsignedintconfigboardnumberSmoke;externvolatileunsignedintconfigboardnumberWarningLight;externvolatileunsignedintconfigboardnumbertemp;項(xiàng)目實(shí)施32修改環(huán)境監(jiān)測(cè)功能頭文件和源文件(3)在classSmart:publicQDialog函數(shù)的public中聲明變量,同時(shí)在privateslots中對(duì)各個(gè)事件函數(shù)進(jìn)行聲明,其詳細(xì)代碼如下所示:public:explicitSmart(QWidget*parent=0);~Smart();Configureconfg;commanddatas;//串口
TcpClientThread*Mytcp;//客戶(hù)端
TcpServerServer;//服務(wù)器
SQLsql;Loglog;QTimer*ReadTimer;//定時(shí)器
intReadDataNum;項(xiàng)目實(shí)施33修改環(huán)境監(jiān)測(cè)功能頭文件和源文件floatSmokeMax,IllMax;//煙霧和光照最大值
privateslots:voidon_btnClose_clicked();//關(guān)閉按鈕事件
voidcloseEvent(QCloseEvent*);//關(guān)閉服務(wù)器
voidReadData();//數(shù)據(jù)更新
voidhq(QByteArraystr);//接收數(shù)據(jù)并判斷、更新
voidon_btnLinkServer_clicked();//連接服務(wù)器按鈕事件
voidon_btnListen_clicked();//監(jiān)聽(tīng)按鈕事件
voidon_btnLink_clicked();//連接按鈕事件
voidconfigure(QStringUserName,QStringPasswd,QStringIP,QStringMask,QStringGetway,QStringMac,QStringServerIp);//更新數(shù)據(jù)庫(kù)項(xiàng)目實(shí)施對(duì)于登錄功能源文件smart.cpp的具體操作如下:(1)打開(kāi)源文件smart.cpp并修改,在函數(shù)Smart::Smart(QWidget*parent)中輸入功能代碼,其主要用于實(shí)現(xiàn)傳感器信息配置和客戶(hù)端實(shí)例化,具體代碼如下:
setWindowFlags(Qt::FramelessWindowHint);//去除界面標(biāo)題欄
//傳感器接口配置
configboardnumberAir=3;configboardnumberCo2=13;configboardnumberCurtain=10;configboardnumberFan=12;configboardnumberGasSensor=7;configboardnumberHumanInfrared=2;configboardnumberHumidity=4;configboardnumberIllumination=5;configboardnumberInfrared=1;configboardnumberLamp=11;34修改環(huán)境監(jiān)測(cè)功能頭文件和源文件項(xiàng)目實(shí)施35修改環(huán)境監(jiān)測(cè)功能頭文件和源文件configboardnumberPM25=8;configboardnumberRFID=14;configboardnumberSmoke=6;configboardnumberWarningLight=9;configboardnumbertemp=4;Mytcp=newTcpClientThread();//實(shí)例化客戶(hù)端
datas.SerialOpen();//打開(kāi)串口
connect(&datas,SIGNAL(serialFinish(QByteArray)),this,SLOT(hq(QByteArray)));//信號(hào)和槽的鏈接格式信號(hào)處理對(duì)象信號(hào)區(qū)域槽函數(shù)(執(zhí)行的動(dòng)作)
ReadTimer=newQTimer(this);//計(jì)時(shí)器實(shí)例化要分配地址,必須是指針
connect(ReadTimer,SIGNAL(timeout()),this,SLOT(ReadData()));項(xiàng)目實(shí)施36修改環(huán)境監(jiān)測(cè)功能頭文件和源文件configboardnumberPM25=8;ReadTimer->start(3000);//3秒讀一次,保證能正確接受到各個(gè)板子的信息
connect(&Server,SIGNAL(bytesArrived(QString,QString,QString,QString,QString,QString,QString)),this,SLOT(configure(QString,QString,QString,QString,QString,QString,QString)));//將接受到的配置網(wǎng)關(guān)的信號(hào)關(guān)聯(lián)到槽
ui->lbServerIP->setText(ServerIP);ui->lbPort->setText(exPort);ui->SmartHome->setStyleSheet("QTabWidget:pane{border-top:0pxsolid#e8f3f9;background:transparent;}");//設(shè)置QTabWidget背景透明項(xiàng)目實(shí)施(3)在程序尾部插入按鈕事件實(shí)現(xiàn)函數(shù),這些函數(shù)均與頭文件smart.h中privateslots中聲明的函數(shù)一一對(duì)應(yīng),其中on_btnClose_clicked()函數(shù)用于關(guān)閉客戶(hù)端線程和退出界面;ReadData()函數(shù)通過(guò)遍歷以讀取節(jié)點(diǎn)板數(shù)據(jù);hq(QByteArraystr)函數(shù)用于對(duì)接收的包數(shù)據(jù)進(jìn)行解析和采集;configure()函數(shù)用于將信息寫(xiě)入數(shù)據(jù)庫(kù),查看IP是否配置成功;on_btnLinkServer_clicked()函數(shù)用于啟動(dòng)客戶(hù)端線程并連接服務(wù)器;on_btnListen_clicked()函數(shù)用于監(jiān)聽(tīng)端口;on_btnLink_clicked()用于管理串口的開(kāi)啟和關(guān)閉。具體代碼如下:/**函數(shù)名稱(chēng):on_btnClose_clicked()*函數(shù)功能:關(guān)閉程序*返回值:空*/voidSmart::on_btnClose_clicked(){Server.close();Mytcp->exit();this->close();}37修改環(huán)境監(jiān)測(cè)功能頭文件和源文件項(xiàng)目實(shí)施38修改環(huán)境監(jiān)測(cè)功能頭文件和源文件/**函數(shù)名稱(chēng):ReadData()*函數(shù)功能:讀取節(jié)點(diǎn)板數(shù)據(jù)*返回值:空*/voidSmart::ReadData(){ReadDataNum++;if(ReadDataNum<=28){datas.ReadNodeData(ReadDataNum);}else{ReadTimer->stop();}}
項(xiàng)目實(shí)施39修改環(huán)境監(jiān)測(cè)功能頭文件和源文件/**函數(shù)名稱(chēng):hq(QByteArraystr)*函數(shù)功能:信息采集*返回值:空*/voidSmart::hq(QByteArraystr){if(str.length()>=5&&str.length()<=300)//對(duì)比包長(zhǎng)度
{if(str[0]!=0&&str[1]!=0)//判斷協(xié)議是否正確
{datas.ReceiveHandle(str);//包解析
//將讀取的數(shù)據(jù)顯示在界面上
ui->lbAir->setText(AirPressure_Value);項(xiàng)目實(shí)施40修改環(huán)境監(jiān)測(cè)功能頭文件和源文件ui->lbCo2->setText(CO2_Value);ui->lbGas->setText(Gas_Value);ui->lbHumidity->setText(Humidity_Value);ui->lbIll->setText(Illumination_Value);ui->lbPM25->setText(PM25_Value);ui->lbRT->setText(StateHumanInfrared?"有人":"無(wú)人");ui->lbSmoke->setText(Smoke_Value);ui->lbTemp->setText(Temp_Value);if(IllMax<Illumination_Value.toFloat()){IllMax=Illumination_Value.toFloat();}if(SmokeMax<Smoke_Value.toFloat()){SmokeMax=Smoke_Value.toFloat();}項(xiàng)目實(shí)施41修改環(huán)境監(jiān)測(cè)功能頭文件和源文件switch(ui->cbQJ->currentIndex())//監(jiān)測(cè)光照數(shù)據(jù)和煙霧數(shù)據(jù)的最大值并顯示在界面上
{case0:ui->leMax->setText("最大值:"+QString::number(IllMax));break;case1:ui->leMax->setText("最大值:"+QString::number(SmokeMax));break;}}}}項(xiàng)目實(shí)施42修改環(huán)境監(jiān)測(cè)功能頭文件和源文件/**函數(shù)名稱(chēng):closeEvent(QCloseEvent*)*函數(shù)功能:closeEvent重載*返回值:空*/voidSmart::closeEvent(QCloseEvent*)//關(guān)閉服務(wù)器,自帶關(guān)閉事件{Server.close();Mytcp->exit();}/*
/**函數(shù)名稱(chēng):configure(QStringUserName,QStringPasswd,QStringIP,QStringMask,QStringGetway,QStringMac,QStringServerIp)*函數(shù)功能:寫(xiě)入數(shù)據(jù)庫(kù),查看IP是否配置成功*返回值:空*/
項(xiàng)目實(shí)施43修改環(huán)境監(jiān)測(cè)功能頭文件和源文件voidSmart::configure(QStringUserName,QStringPasswd,QStringIP,QStringMask,QStringGetway,QStringMac,QStringServerIp){if(sql.SqlQueryCount()==1){if(!sql.SqlAddRecord(UserName,Passwd,IP,Mask,Getway,Mac,ServerIp))//數(shù)據(jù)庫(kù)增加記錄log.WriteLog("AddRecordfailure");}項(xiàng)目實(shí)施44修改環(huán)境監(jiān)測(cè)功能頭文件和源文件elseif(sql.SqlQueryCount()==2)//否則更新數(shù)據(jù)庫(kù){if(!sql.SqlUpdateRecord(UserName,Passwd,IP,Mask,Getway,Mac,ServerIp))log.WriteLog("UpdateRecordfailure");}if(!confg.ConfigureIP())//配置網(wǎng)關(guān)ip{log.WriteLog("ConfigureIPfailure");}elseQProcess::execute(QString("reboot"));//實(shí)現(xiàn)重啟}項(xiàng)目實(shí)施45修改環(huán)境監(jiān)測(cè)功能頭文件和源文件/**函數(shù)名稱(chēng):on_btnLinkServer_clicked()*函數(shù)功能:連接服務(wù)器*返回值:空*/voidSmart::on_btnLinkServer_clicked(){Mytcp->start();ui->btnLinkServer->setText("已連接服務(wù)器");}項(xiàng)目實(shí)施46修改環(huán)境監(jiān)測(cè)功能頭文件和源文件/**函數(shù)名稱(chēng):on_btnListen_clicked()*函數(shù)功能:端口監(jiān)聽(tīng)*返回值:空*/voidSmart::on_btnListe
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中專(zhuān)護(hù)理筆試題及答案解析
- 2025年中專(zhuān)會(huì)計(jì)期末考試真題及答案
- 數(shù)字化保護(hù)視角下的2025年文化遺產(chǎn)與文化遺產(chǎn)數(shù)字化保護(hù)技術(shù)應(yīng)用創(chuàng)新
- 面向2025年的裝備制造業(yè)自主創(chuàng)新能力培養(yǎng)模式研究報(bào)告
- 中心城區(qū)老舊市政排水管網(wǎng)修復(fù)工程運(yùn)營(yíng)管理手冊(cè)
- 道路施工安全防護(hù)措施方案
- 輸變電工程施工現(xiàn)場(chǎng)管理方案
- 2025年浙江杭州事業(yè)單位招聘考試衛(wèi)生類(lèi)中醫(yī)學(xué)專(zhuān)業(yè)知識(shí)試卷
- 提高間接成本控制
- 2025年智能樓宇管理師(高級(jí))建筑抗震監(jiān)測(cè)試題
- 中國(guó)航天建筑某廠房施工組織設(shè)計(jì)
- 2024年國(guó)網(wǎng)山東省電力公司招聘考試真題
- 全國(guó)高校輔導(dǎo)員素質(zhì)能力大賽試題(談心談話、案例分析)
- 平安建設(shè)知識(shí)宣講課件
- 二零二五年度學(xué)校校園四害防治與消殺管理合同2篇
- 醫(yī)院物業(yè)管理服務(wù)投標(biāo)文件(技術(shù)方案)
- (DB45T 2149-2020)《公路邊坡工程技術(shù)規(guī)范》
- 2024年中級(jí)注冊(cè)安全工程師《安全生產(chǎn)法律法規(guī)》真題及答案
- 智能交通系統(tǒng)技術(shù)標(biāo)準(zhǔn)與實(shí)施方案
- 人文視野中的生態(tài)學(xué)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- GB/T 17374-2024食用植物油銷(xiāo)售包裝
評(píng)論
0/150
提交評(píng)論