第2章 登錄注冊_第1頁
第2章 登錄注冊_第2頁
第2章 登錄注冊_第3頁
第2章 登錄注冊_第4頁
第2章 登錄注冊_第5頁
已閱讀5頁,還剩67頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

智能家居平臺應(yīng)用項(xiàng)目化教程第2章登錄注冊相關(guān)知識介紹項(xiàng)目實(shí)施實(shí)訓(xùn)項(xiàng)目2項(xiàng)目描述項(xiàng)目描述3項(xiàng)目描述智能家居應(yīng)用主要用于監(jiān)測環(huán)境參數(shù)和控制家電設(shè)備,因此其安全性設(shè)計(jì)至關(guān)重要,而登錄注冊作為一個(gè)用戶授權(quán)的功能模塊,能夠有效避免無關(guān)用戶對重要功能的操作及使用。本章將主要講解登錄注冊模塊的設(shè)計(jì)思路和所需要的基礎(chǔ)知識。4相關(guān)知識介紹5相關(guān)知識介紹SQLite是一種嵌入式數(shù)據(jù)庫,它的數(shù)據(jù)庫就是一個(gè)文件。由于SQLite本身是C寫的,而且體積很小,所以,經(jīng)常被集成到各種應(yīng)用程序中,甚至在iOS和Android的App中都可以集成。因此其是一款實(shí)現(xiàn)了自給自足的、無服務(wù)器的、零配置的、事務(wù)性的

SQL數(shù)據(jù)庫引擎,基于此種特性,它很好的符合了智能家居嵌入式平臺應(yīng)用的使用場景及需求,為其登錄注冊模塊提供了相對便利和安全的存儲方式。6SQLite數(shù)據(jù)庫相關(guān)知識介紹SQLite具有以下優(yōu)勢:不需要一個(gè)單獨(dú)的服務(wù)器進(jìn)程或操作的系統(tǒng)(無服務(wù)器的)。SQLite不需要配置,這意味著不需要安裝或管理。一個(gè)完整的SQLite數(shù)據(jù)庫是存儲在一個(gè)單一的跨平臺的磁盤文件。SQLite是非常小的,是輕量級的,完全配置時(shí)小于400KB,省略可選功能配置時(shí)小于250KB。SQLite是自給自足的,這意味著不需要任何外部的依賴。SQLite事務(wù)是完全兼容ACID的,允許從多個(gè)進(jìn)程或線程安全訪問。SQLite支持SQL92(SQL2)標(biāo)準(zhǔn)的大多數(shù)查詢語言的功能。SQLite使用ANSI-C編寫的,并提供了簡單和易于使用的API。SQLite可在UNIX(Linux,MacOS-X,Android,iOS)和Windows(Win32,WinCE,WinRT)中運(yùn)行。7SQLite數(shù)據(jù)庫相關(guān)知識介紹SQLite中常用的語句分為增刪改查四種,其使用方法如下:(1)插入數(shù)據(jù)插入語句的格式如下所示:insert[into]<表名>(列名)values(列值)

例如在一個(gè)學(xué)生表Students中插入一行信息的語句為:insertintoStudents(name,sex,birth)values('開心朋朋','男','1980/6/15');(2)刪除數(shù)據(jù)刪除語句的格式如下所示:deletefrom<表名>[where<刪除條件>]例如刪除學(xué)生表Students中姓名為“開心朋朋”的語句為:deletefromStudentswherename='開心朋朋';8SQLite數(shù)據(jù)庫相關(guān)知識介紹(3)修改數(shù)據(jù)刪除語句的格式如下所示:update<表名>set<列名=更新值>[where<更新條件>]例如修改學(xué)生表Students中姓名為“開心朋朋”的性別為“女”的語句為:updateStudentssetsex='女'wherename='開心朋朋';(4)查詢數(shù)據(jù)查詢語句的格式如下所示:select<列名>from<表名>[where<查詢條件表達(dá)試>][orderby<排序的列名>[asc或desc]]例如查詢學(xué)生表Students中所有學(xué)生信息的語句為:select*fromStudents;9SQLite數(shù)據(jù)庫相關(guān)知識介紹柵格布局管理器QGridLayout類主要用于實(shí)現(xiàn)部件在網(wǎng)格中布局,它將所有的空間分割成一定數(shù)量的行和列,并把每個(gè)窗口部件插入并管理到正確的單元格,其工作原理如下:柵格布局管理器QGridLayout首先計(jì)算了位于其中的空間,然后將它們合理的劃分成若干個(gè)行(row)和列(column),并把每個(gè)由它管理的窗口部件放置在合適的單元之中,這里所指的單元(cell)即是指由行和列交叉所劃分出來的空間。控件效果如圖所示:10柵格布局管理器QGridLayout相關(guān)知識介紹11QGridLayout主要函數(shù)函數(shù)說明addLayout(Qlayout*layout,introw,intcolumn,Qt::Alignment=0)主要用于在QGridLayout中添加布局。其中l(wèi)ayout表示需要添加的布局對象;row和column分別表示添加布局網(wǎng)格的行號和列號;Qt::Alignment表示布局放置在單元格中的位置,默認(rèn)為0表示填充整個(gè)單元格。addWidget(QWidget*widget,introw,intcolumn,Qt::Alignment=0)主要用于在QGridLayout中添加控件。其中widget表示需要添加的窗口部件;row和column分別表示添加部件網(wǎng)格的行號和列號;Qt::Alignment表示控件放置在單元格中的位置,默認(rèn)為0表示填充整個(gè)單元格。QRectcellRect(introw,intcolumn)主要用于獲取根據(jù)row和column值所確定單元格的空間尺寸,如果row和column越界,則返回?zé)o效的QRectintcolumnCount()獲取QGridLayout中的列數(shù),同樣有rowCount返回行數(shù)相關(guān)知識介紹12QGridLayout主要函數(shù)函數(shù)說明intcolumnMinimumWidth(intcolumn)獲取指定列的最小寬度,該值可以通過函數(shù)setColumnMinimuWidth(intcolumn,intwidth)設(shè)置。同樣有rowMinimumHeight(introw)獲取某一行的最小高度,且利用函數(shù)setRowMinimunHeight(introw,intheight)進(jìn)行設(shè)置intcolumnStretch(intcolumn)獲取指定列column的拉升因子,該值可以通過函數(shù)setColumnStretch(intcolumn,intstretch)進(jìn)行設(shè)置。同樣函數(shù)introwStretch(introw)可以獲取行row的伸縮值,并通過函數(shù)setRowStretch(introw,intstretch)設(shè)置。count()返回網(wǎng)格有多少個(gè)單元voidgetItemPosition(intindex,int*row,int*column,int*rowSpan,int*columnspan)用于獲取index所制定的元素所在的行列號及水平垂直所占用的跨越單元個(gè)數(shù)。setSpacing()設(shè)置網(wǎng)格垂直及水平方向控件之間的間隔尺寸。該值可以利用函數(shù)spacing()獲取,并且如果horizontalSpacing與verticalSpacing不同則返回-1。相關(guān)知識介紹QLabel是Qt界面中的標(biāo)簽類,它繼承自QFrame類,其主要用于文本或圖像的顯示,但沒有提供用戶交互功能。一個(gè)QLabel可以包含下表中的任意內(nèi)容類型。13QLabel、QLineEdit和QPushButtion內(nèi)容設(shè)置純文本使用setText()設(shè)置一個(gè)QString富文本使用setText()設(shè)置一個(gè)富文本的QString,相比較于純文本,富文本可以對選中的部分單獨(dú)設(shè)置字體、字形、字號、顏色圖像使用setPixmap()設(shè)置一個(gè)圖像動畫使用setMovie()設(shè)置一個(gè)動畫數(shù)字使用setNum()設(shè)置int或double,并轉(zhuǎn)換為純文本。Nothing空的純文本,默認(rèn)的,使用clear()設(shè)置相關(guān)知識介紹QLineEdit部件是一個(gè)單行文本輸入框,它允許用戶輸入和編輯單行純文本,它提供了很多有用的編輯功能,包括:撤銷和重做、剪切和粘貼、以及拖放等。下表中列舉了QLineEdit部件的常用接口。14QLabel、QLineEdit和QPushButtion函數(shù)說明QStringtext()返回輸入框的當(dāng)前文本。voidaddAction(QAction*action,ActionPositionposition)添加action至指定位置。Qt::Alignmentalignment()用于設(shè)置輸入框的對齊方式(水平和垂直方向)。默認(rèn)情況下,該屬性包含Qt::AlignLeft和Qt::AlignVCenter。相關(guān)知識介紹15QLabel、QLineEdit和QPushButtion函數(shù)說明QStringselectedText()返回選中的的文本。如果沒有選中,返回一個(gè)空字符串。默認(rèn)為一個(gè)空字符串。voidsetCursorPosition(int)用于設(shè)置輸入框當(dāng)前光標(biāo)的位置。設(shè)置光標(biāo)位置時(shí),會重新繪制光標(biāo)位置。默認(rèn)情況下,屬性值為0。voidsetEchoMode(EchoMode)用于設(shè)置輸入框的顯示模式。顯示模式?jīng)Q定了輸入框?qū)τ脩舻奈谋撅@示。默認(rèn)值為Normal,同時(shí)包含NoEcho、Password和PasswordEchoOnEdit等其它模糊輸入。注意部件的顯示、復(fù)制或拖動文本的行為受此設(shè)置的影響。voidsetMaxLength(int)用于設(shè)置文本的最大允許長度。如果文本太長,將從限制的位置截?cái)?。默認(rèn)值為32767。voidsetReadOnly(bool)用于設(shè)置輸入框是否為只讀。在只讀模式下,用戶仍然可以將文本復(fù)制到剪貼板,或拖放文本(如果echoMode()是Normal),但不能編輯它。注意只讀模式下,QLineEdit也不顯示光標(biāo)。voidsetValidator(constQValidator*v)設(shè)置輸入框的驗(yàn)證器,將限制任意可能輸入的文本。如果v==0,將會清除當(dāng)前的輸入驗(yàn)證器。相關(guān)知識介紹QPushButton部件繼承自QButton類,通常用于執(zhí)行命令或觸發(fā)事件。其中下表列舉了其常用成員函數(shù)。16QLabel、QLineEdit和QPushButtion函數(shù)說明QPushButton::QPushButton(constQString&text,QWidget*parent,constchar*name=0)構(gòu)造一個(gè)名稱為name,父對象為parent并且文本為text的按鈕voidQButton::pressed()[信號]當(dāng)按下該按鈕時(shí)發(fā)射信號voidQButton::clicked()[信號]當(dāng)單擊該按鈕時(shí)發(fā)射信號voidQButton::released()[信號]當(dāng)釋放該按鈕時(shí)發(fā)射信號voidQButton::setText(constQString&)設(shè)置該按鈕上顯示的文本QStringQButton::text()返回該按鈕上顯示的文本相關(guān)知識介紹QMouseEvent類包含了用于描述鼠標(biāo)事件的參數(shù)。當(dāng)在一個(gè)窗口里按住鼠標(biāo)按鍵、或移動、或釋放就會產(chǎn)生鼠標(biāo)事件QMouseEvent。當(dāng)需要對鼠標(biāo)事件進(jìn)行處理時(shí),通常要重新實(shí)現(xiàn)以下幾個(gè)鼠標(biāo)事件處理函數(shù):QWidget::mousePressEvent():鼠標(biāo)按下處理事件QWidget::mouseReleaseEvent():鼠標(biāo)釋放處理事件QWidget::mouseDoubleClickEvent():鼠標(biāo)雙擊處理事件QWidget::mouseMoveEvent:鼠標(biāo)移動處理事件17鼠標(biāo)事件相關(guān)知識介紹標(biāo)準(zhǔn)對話框是Qt內(nèi)置的一系列對話框,它主要用于簡化開發(fā)。事實(shí)上,有很多對話框都是通用的,比如打開文件、設(shè)置顏色、打印設(shè)置等。這些對話框在所有程序中幾乎相同,因此沒有必要在每一個(gè)程序中都自己實(shí)現(xiàn)這么一個(gè)對話框。QMessageBox是指模態(tài)對話框,主要用于顯示信息、詢問問題等,其控件運(yùn)行效果如圖所示:18標(biāo)準(zhǔn)對話框QMessageBox相關(guān)知識介紹19QMessageBox常用幾種消息提示類型函數(shù)說明QMessageBox::about(QWidget*parent,constQString&title,constQString&text)用于顯示關(guān)于對話框。這是一個(gè)最簡單的對話框,其標(biāo)題是title,內(nèi)容是text,父窗口是parent。對話框只有一個(gè)OK按鈕。QMessageBox::aboutQt(QWidget*parent,constQString&title=QString())用于顯示關(guān)于Qt信息的對話框,其標(biāo)題是title,父窗口是parent。QMessageBox::critical(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttons=Ok,StandardButtondefaultButton=NoButton)用于顯示嚴(yán)重錯(cuò)誤對話框。這個(gè)對話框?qū)@示一個(gè)紅色的錯(cuò)誤符號。我們可以通過buttons參數(shù)指明其顯示的按鈕。默認(rèn)情況下只有一個(gè)Ok按鈕,我們可以使用StandardButtons類型指定多種按鈕。QMessageBox::question(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttons=StandardButtons(Yes|No),StandardButtondefaultButton=NoButton)QMessageBox::question()函數(shù)與QMessageBox::critical()類似,不同之處在于這個(gè)對話框提供一個(gè)問號圖標(biāo),并且其顯示的按鈕是“是”和“否”兩個(gè)。QMessageBox::warning(QWidget*parent,constQString&title,constQString&text,StandardButtonsbuttons=Ok,StandardButtondefaultButton=NoButton)QMessageBox::warning()函數(shù)與QMessageBox::critical()類似,不同之處在于這個(gè)對話框提供一個(gè)黃色嘆號圖標(biāo)。項(xiàng)目實(shí)施20項(xiàng)目實(shí)施為保證智能家居平臺應(yīng)用的安全性和可靠性,它需要通過開發(fā)設(shè)計(jì)登錄注冊模塊來實(shí)現(xiàn)授權(quán)用戶后續(xù)功能的可操作性,最后驗(yàn)證該功能的實(shí)際運(yùn)行情況并根據(jù)實(shí)驗(yàn)要求完善其設(shè)計(jì)。通過本項(xiàng)目的完成,使學(xué)生可以掌握以下技能:能夠創(chuàng)建合適的Qt工程項(xiàng)目并根據(jù)需要添加資源文件;能夠理解并靈活使用柵格布局管理器、基礎(chǔ)控件、鼠標(biāo)事件和標(biāo)準(zhǔn)對話框能夠利用代碼實(shí)現(xiàn)SQLite數(shù)據(jù)庫的增刪改查操作;能夠通過調(diào)試解決代碼的錯(cuò)誤提示并保證正常編譯運(yùn)行。21方案設(shè)計(jì)和項(xiàng)目目標(biāo)項(xiàng)目實(shí)施(1)選擇項(xiàng)目模板。在QtCreator主界面上選擇“文件->新建文件或項(xiàng)目”菜單項(xiàng)(也可以通過主界面上的“創(chuàng)建項(xiàng)目”或者快捷鍵Ctrl+N實(shí)現(xiàn)),在彈出的新建模塊界面中選擇Qt控件項(xiàng)目中的“QtGui應(yīng)用”一項(xiàng),然后單擊“選擇按鈕”,其結(jié)果如下圖所示。22Qt工程創(chuàng)建項(xiàng)目實(shí)施(2)輸入項(xiàng)目信息。在“項(xiàng)目介紹和位置”界面中輸入項(xiàng)目的名稱SmartHome(項(xiàng)目名稱可以自己設(shè)定,這里就以“SmartHome”為項(xiàng)目名稱),隨后單擊“瀏覽”按鈕在選擇Documents文件夾,點(diǎn)擊“Open”確定操作,如圖所示。完成后單擊“下一步”進(jìn)入下個(gè)界面(注意項(xiàng)目名稱和路徑中均不可以出現(xiàn)中文)。23Qt工程創(chuàng)建項(xiàng)目實(shí)施(3)選擇構(gòu)建套件。首先在SmartHome工程項(xiàng)目的根目錄下新建文件夾,詳細(xì)設(shè)置如表所示,同時(shí)將lib-SmartHomeGateway-X86.so類庫復(fù)制到Release-x86文件夾和Debug-x86文件夾中,將lib-SmartHomeGateway-ARM.so類庫復(fù)制到Release-ARM文件夾和Debug-ARM文件夾中。在“創(chuàng)建構(gòu)建設(shè)置”中選擇手動設(shè)置,并根據(jù)需要分別設(shè)置發(fā)布版本和調(diào)試版本的工作目錄。然后單擊“下一步”。24Qt工程創(chuàng)建文件夾名稱用途Debug-x86存儲虛擬機(jī)中運(yùn)行的調(diào)試版本編譯文件Debug-ARM存儲網(wǎng)關(guān)中運(yùn)行的調(diào)試版本編譯文件Release-x86存儲虛擬機(jī)中運(yùn)行的發(fā)布版本編譯文件Release-ARM存儲網(wǎng)關(guān)中運(yùn)行的發(fā)布版本編譯文件項(xiàng)目實(shí)施(4)輸入類信息。在如圖所示的類信息界面中已經(jīng)自動生成了項(xiàng)目工程的類名,此處修改類名為Login,基類選擇QDialog,表明該類繼承自QDialog類,使用這個(gè)類可以自動生成一個(gè)對話框界面,且下面的頭文件、源文件和界面文件都會自動生成,然后單擊“下一步”。25Qt工程創(chuàng)建項(xiàng)目實(shí)施(5)設(shè)置項(xiàng)目管理。在該界面可以看到所創(chuàng)建項(xiàng)目的匯總信息,同時(shí)還可以設(shè)置版本控制系統(tǒng),但在本項(xiàng)目中不會涉及,直接單擊“完成”結(jié)束項(xiàng)目創(chuàng)建,如右圖所示。(6)根據(jù)項(xiàng)目需求,需要單獨(dú)創(chuàng)建一個(gè)注冊界面,所以接下來需要添加新文件。在項(xiàng)目文件名稱處點(diǎn)擊鼠標(biāo)右鍵會彈出如右圖所示的對話框,單擊“添加新文件”。26Qt工程創(chuàng)建項(xiàng)目實(shí)施(7)添加Qt設(shè)計(jì)師界面類。在如右圖所示的彈出界面中選擇Qt下的“Qt設(shè)計(jì)師界面類”,然后單擊“選擇”按鈕。在Qt中,每一個(gè)界面類包含了頭文件、源文件和界面文件,選擇“Qt設(shè)計(jì)師界面類”選項(xiàng)后,會自動生成這三項(xiàng)文件。(8)選擇界面模板。在右圖中的界面中選擇“DialogwithoutButtons”,即無按鈕界面樣式,然后單擊“下一步”。27Qt工程創(chuàng)建項(xiàng)目實(shí)施(9)選擇類名。將類名對話框中的名稱改為Register,其主要用于實(shí)現(xiàn)注冊功能,這時(shí)下面的頭文件、源文件和界面文件都會自動生成,保持默認(rèn)即可,如右圖所示,然后單擊“下一步”。(10)項(xiàng)目管理。在如右圖所示的項(xiàng)目管理界面中會顯示所有添加的文件名稱,單擊“完成”結(jié)束添加新文件操作。28Qt工程創(chuàng)建項(xiàng)目實(shí)施(1)在項(xiàng)目文件名稱處點(diǎn)擊鼠標(biāo)右鍵單擊“添加新文件”,在右圖所示的界面中選擇Qt的“Qt資源文件”,完成后單擊“選擇”。(2)如右圖所示,在名稱對話框中輸入資源文件的名稱Images,路徑保持默認(rèn)即可,隨后單擊“下一步”。29添加資源文件及頭文件項(xiàng)目實(shí)施(3)在右圖所示的項(xiàng)目管理界面中會顯示所有添加的文件名稱,單擊“完成”結(jié)束添加資源文件操作。(4)打開新添加的資源文件Images.qrc,單擊“添加”選擇“添加前綴”,并將其前綴名稱改為images,這樣有利于代碼編寫時(shí)能夠根據(jù)前綴名來導(dǎo)入圖片,而不需要知道詳細(xì)的圖片路徑,其界面如右圖所示。30添加資源文件及頭文件項(xiàng)目實(shí)施(5)在SmartHome工程項(xiàng)目的根目錄中新建images文件夾,將項(xiàng)目所需的圖片素材全部復(fù)制到該文件夾中。隨后再次單擊“添加”選擇“添加文件”,并在彈出的對話框中選擇images文件夾路徑下所需添加的圖片素材文件,完成后的界面如圖所示。31添加資源文件及頭文件項(xiàng)目實(shí)施為方便利用QtCreator開發(fā)應(yīng)用程序,其通常需要引用各類已通過編譯測試的頭文件,這些文件的搭配使用極大降低了應(yīng)用程序的開發(fā)周期。以下是添加頭文件的詳細(xì)操作流程:(1)將需要添加的文件復(fù)制到工程文件的根目錄下,如圖所示,將所需頭文件command.h、configure.h、jsoncommand.h、log.h、posix_qextserialport.h、qextserialbase.h、qextserialport.h、sql.h、tcpclientthread.h、tcpserver.h、tcpthread.h和VariableDefinition.h復(fù)制到項(xiàng)目SmartHome的根目錄中。32添加資源文件及頭文件項(xiàng)目實(shí)施(2)打開工程項(xiàng)目文件SmartH,右鍵頭文件文件夾,選擇“添加現(xiàn)有文件”,依次將所需添加的頭文件添加后即可顯示在工程中,其項(xiàng)目結(jié)構(gòu)如右下圖所示。33添加資源文件及頭文件項(xiàng)目實(shí)施34添加功能模塊類在以上步驟的基礎(chǔ)上添加設(shè)計(jì)師界面類DataBrowse、Smart以及編譯所需的庫文件lib-SmartHomeGateway-X86.so,其中SmartH的代碼結(jié)構(gòu)如下:QT+=coreguiQT+=network#添加network模塊用于網(wǎng)絡(luò)通信QT+=script#添加script模塊用于解析JSONQT+=sql#添加sql模塊用于數(shù)據(jù)庫操作LIBS+=./lib-SmartHomeGateway-X86.so#添加庫文件TARGET=SmartHome#項(xiàng)目名稱TEMPLATE=app項(xiàng)目實(shí)施35添加功能模塊類

SOURCES+=main.cpp\#源文件列表…….HEADERS+=login.h\#頭文件列表…….FORMS+=login.ui\#界面文件列表…….RESOURCES+=\#資源文件列表Images.qrc項(xiàng)目實(shí)施Label控件的使用方法如下:(1)選擇找到界面文件,在本項(xiàng)目中以login.ui為例。雙擊“l(fā)ogin.ui”文件,進(jìn)入圖形化界面設(shè)計(jì)窗體,在窗體的左側(cè)的DisplayWidgets欄找到Label圖標(biāo),如左圖所示。Label就是Qt開發(fā)中常用的文本標(biāo)簽。36修改界面布局項(xiàng)目實(shí)施(2)選中Label圖標(biāo),將它拖拽至界面中,就成功地在界面中添加了一個(gè)文本標(biāo)簽了。此時(shí)可以將Label中的文本修改成符合項(xiàng)目需求的文本了,在此處就以“溫濕度:”為例。修改文本的方法有兩種,第一種是:雙擊剛剛拖出來的Label控件,將它自帶的“TextLabel”文本修改為“溫濕度:”文本,如右圖所示。另一種方法則是:選中剛剛拖出來的Label后,在右側(cè)的屬性欄中找到text屬性,在其中輸入文本“溫濕度:”即可,如右圖所示。37修改界面布局項(xiàng)目實(shí)施(3)為了在項(xiàng)目以后的開發(fā)過程中,避免控件太多導(dǎo)致的混淆,就需要修改控件的名稱,在右上角的控件列表中找到這個(gè)label,修改它的名稱,在此處就以temp為例,如下圖所示。38修改界面布局項(xiàng)目實(shí)施LineEdit控件的使用方法如下:(1)選擇找到界面文件,在本項(xiàng)目中以login.ui為例。雙擊“l(fā)ogin.ui”文件,進(jìn)入圖形化界面設(shè)計(jì)窗體,在窗體的左側(cè)的InputWidgets欄找到LineEdit圖標(biāo),如圖所示。LineEdit是Qt開發(fā)中常用的單行文本輸入控件,一般用于用戶名、密碼等少量文本交互地方。39修改界面布局項(xiàng)目實(shí)施(2)選中LineEdit圖標(biāo),將它拖拽至界面中,就能成功在界面中添加一個(gè)輸入文本。此時(shí)可以將LineEdit中的文本修改成符合項(xiàng)目需求的文本了,在此處就以“bizideal”為例。修改文本的方法有兩種,第一種是:雙擊剛剛拖出來的LineEdit控件,將它自帶的空白文本修改為“bizideal”文本,如右圖所示。另一種方法則是:選中剛剛拖出來的LineEdit后,在右側(cè)的屬性欄中找到text屬性,在其中輸入文本“bizideal”即可,如右圖所示。40修改界面布局項(xiàng)目實(shí)施(3)為了在項(xiàng)目以后的開發(fā)過程中,避免控件太多導(dǎo)致的混淆,就需要修改控件的名稱,在右上角的控件列表中找到這個(gè)LineEdit,修改它的名稱,在此處就以username為例,如圖所示。41修改界面布局項(xiàng)目實(shí)施PushButton控件主要有兩種表現(xiàn)形式,第一種是使用文本表示按鈕內(nèi)容,第二種是用圖片表示內(nèi)容,以下是兩種表示方法的具體設(shè)置步驟:(1)選擇找到界面文件,在本項(xiàng)目中以login.ui為例。雙擊“l(fā)ogin.ui”文件,進(jìn)入圖形化界面設(shè)計(jì)窗體,在窗體的左側(cè)的Buttons欄找到PushButton圖標(biāo),如圖所示。PushButton是Qt開發(fā)中用來命令計(jì)算機(jī)執(zhí)行一些操作,或者回答一個(gè)問題。42修改界面布局項(xiàng)目實(shí)施(2)選中PushButton圖標(biāo),將它拖拽至界面中,就能成功在界面中添加一個(gè)命令按鈕,此時(shí)可以將PushButton中的文本修改成符合項(xiàng)目需求的文本了,在此處就以“登錄”為例。修改文本的方法有兩種,第一種是:雙擊剛剛拖出來的PushButton控件,將它自帶的“PushButton”文本修改為“登錄”文本,如右圖所示。

另一種方法則是:選中剛剛拖出來的PushButton后,在右側(cè)的屬性欄中找到text屬性,在其中輸入文本“登錄”即可,如右圖所示。43修改界面布局項(xiàng)目實(shí)施(3)為了在項(xiàng)目以后的開發(fā)過程中,避免控件太多導(dǎo)致的混淆,就需要修改控件的名稱,在右上角的控件列表中找到這個(gè)PushButton,修改它的名稱,在此處就以login為例,如右圖所示。(4)對于以圖片作為背景的PushButton按鈕,其首先拖拽一個(gè)PushButton控件至界面中,將其自帶的“PushButton”文本刪除,使其內(nèi)容變?yōu)榭瞻?,如右圖所示。44修改界面布局項(xiàng)目實(shí)施(5)鼠標(biāo)右擊該按鈕控件,選擇“改變樣式表”

,在彈出的樣式表對話框中選擇“添加資源”里的“border-image”,如圖所示。(6)在彈出的界面中選擇所需添加的背景圖片,完成后會在樣式表對話框中顯示所添加圖片的相對路徑,如右圖所示。單擊“確定”按鈕完成操作。45修改界面布局項(xiàng)目實(shí)施登錄界面login.ui的界面布局效果圖如下圖所示,其中控件的詳細(xì)信息如右表所示:46修改界面布局控件ID控件類別控件內(nèi)容labelQLabel用戶名:label_2QLabel密碼:label_3QLabel服務(wù)器IP:label_4QLabel端口號:leIDQLineEditbizideallePWQLineEdit123456leServerIpQLineEditlePortQLineEdit6001btnLoginQPushButton登錄btnRegisterQPushButton注冊賬戶btnSelectQPushButton查看賬戶btnManageQPushButton管理賬戶btnCloseQPushButton關(guān)閉系統(tǒng)項(xiàng)目實(shí)施注冊界面register.ui的界面布局效果圖如下圖所示,其控件詳細(xì)信息如右表所示:47修改界面布局控件ID控件類別控件內(nèi)容labelQLabel用戶名:label_2QLabel密碼:label_3QLabel確認(rèn)密碼:leIDQLineEdit

lePWQLineEdit

lePW2QLineEdit

btnRegisterQPushButton注冊btnCloseQPushButton項(xiàng)目實(shí)施數(shù)據(jù)瀏覽界面databrowse.ui的界面布局效果圖如下圖所示,其控件詳細(xì)信息如下表所示:48修改界面布局控件ID控件類別控件內(nèi)容tableViewQTableView

btnDeleteQPushButton刪除賬戶btnCloseQPushButton項(xiàng)目實(shí)施主界面smart.ui的界面布局效果圖如下圖所示,其控件詳細(xì)信息如下表所示:49修改界面布局控件ID控件類別控件內(nèi)容labelQLabel成功進(jìn)入主界面項(xiàng)目實(shí)施登錄功能主要是用于實(shí)現(xiàn)驗(yàn)證用戶信息,判斷是否給予該用戶使用權(quán)限,其功能模塊主要由頭文件login.h和源文件login.cpp實(shí)現(xiàn)。其中l(wèi)ogin.h的具體編寫步驟如下:(1)修改login.h頭文件,在其首部引入其它功能的頭文件,以此實(shí)現(xiàn)功能模塊之間的交互,因此在代碼#include<QDialog>下一行寫入如下代碼:#include"QMessageBox"http://導(dǎo)入Qt對話框#include"sql.h"http://導(dǎo)入數(shù)據(jù)庫操作功能的頭文件#include"register.h"http://導(dǎo)入用戶注冊功能的頭文件#include"databrowse.h"http://導(dǎo)入用戶查看功能的頭文件#include"tcpclientthread.h"http://導(dǎo)入環(huán)境參數(shù)傳遞至服務(wù)器操作的客戶端線程類頭文件#include"tcpserver.h"http://導(dǎo)入網(wǎng)絡(luò)服務(wù)端類頭文件#include"smart.h"http://導(dǎo)入主要功能模塊實(shí)現(xiàn)函數(shù)的頭文件50修改登錄功能頭文件和源文件項(xiàng)目實(shí)施51修改登錄功能頭文件和源文件(2)隨后在以上代碼的下一行聲明deleteZhi和exPort兩個(gè)全局變量,

SOURCES+=main.cpp\#源文件列表…….

HEADERS+=login.h\#頭文件列表…….

FORMS+=login.ui\#界面文件列表…….

RESOURCES+=\#資源文件列表Images.qrc其代碼和注釋如下所示:externintdeleteZhi;//用于判斷賬戶刪除操作是否符合條件externQStringexPort;//用于讀取所輸入的端口號項(xiàng)目實(shí)施52修改登錄功能頭文件和源文件(3)在classLogin:publicQDialog函數(shù)的public中聲明Sql變量,同時(shí)在privateslots中對各個(gè)按鈕事件進(jìn)行聲明,其詳細(xì)代碼如下所示:public:explicitLogin(QWidget*parent=0);~Login();SQLSql;//聲明一個(gè)SQL類實(shí)例

privateslots://聲明鼠標(biāo)單擊事件的槽函數(shù)voidon_btnClose_clicked();//關(guān)閉按鈕點(diǎn)擊事件

voidon_btnManage_clicked();//賬戶管理按鈕點(diǎn)擊事件

voidon_btnSelect_clicked();//賬戶查看按鈕點(diǎn)擊事件

voidon_btnRegister_clicked();//賬戶注冊按鈕點(diǎn)擊事件

voidon_btnLogin_clicked();//賬戶登錄按鈕點(diǎn)擊事件項(xiàng)目實(shí)施對于登錄功能源文件login.cpp的具體操作如下:(1)對頭文件login.h中聲明的deleteZhi和exPort兩個(gè)全局變量進(jìn)行初始化,其位置處于#include"ui_login.h"下一行,具體代碼如下:intdeleteZhi=0;QStringexPort="";(2)在函數(shù)Login::Login(QWidget*parent)中輸入功能代碼,其主要用于實(shí)現(xiàn)界面初始化工作,即當(dāng)?shù)卿浗缑鎲訒r(shí)完成數(shù)據(jù)庫創(chuàng)建和用戶信息插入,其代碼如下:53修改登錄功能頭文件和源文件54項(xiàng)目實(shí)施setWindowFlags(Qt::FramelessWindowHint);//使窗口去掉標(biāo)題欄

staticinti=0;if(i==0){if(!Sql.SqlConnect()){this->deleteLater();}QSqlQuerysql;sql.exec("createtableuser(name,pwd)");//創(chuàng)建數(shù)據(jù)庫user,其屬性包括用戶名name和密碼pwdsql.exec("select*fromuserwherename='"+ui->leID->text()+"'andpwd='"+ui->lePW->text()+"'");//對數(shù)據(jù)庫進(jìn)行查找

if(sql.next()){}else{sql.prepare("insertintouservalues('bizideal','123456')");//將數(shù)據(jù)插入數(shù)據(jù)庫中

sql.exec();//執(zhí)行數(shù)據(jù)庫操作命令

}}i++;55項(xiàng)目實(shí)施(3)在程序尾部插入按鈕事件實(shí)現(xiàn)函數(shù),這些函數(shù)均與頭文件login.h中privateslots中聲明的函數(shù)一一對應(yīng),具體代碼如下:/**函數(shù)名稱:on_btnClose_clicked()*函數(shù)功能:關(guān)閉程序*返回值:空*/voidLogin::on_btnClose_clicked(){this->close();//關(guān)閉該窗口}/**函數(shù)名稱:on_btnManage_clicked()*函數(shù)功能:管理數(shù)據(jù)庫*返回值:空*/voidLogin::on_btnManage_clicked(){deleteZhi=1;//全局變量deleteZhi設(shè)置為1DataBrowsea;//新建數(shù)據(jù)瀏覽窗口

a.exec();}56項(xiàng)目實(shí)施/**函數(shù)名稱:on_btnSelect_clicked()*函數(shù)功能:查看數(shù)據(jù)庫*返回值:空*/voidLogin::on_btnSelect_clicked(){deleteZhi=2;//全局變量deleteZhi設(shè)置為2DataBrowsea;//新建數(shù)據(jù)瀏覽窗口

a.exec();}/**函數(shù)名稱:on_btnRegister_clicked()*函數(shù)功能:注冊程序*返回值:空*/voidLogin::on_btnRegister_clicked(){Registera;//新建用戶注冊窗口

this->close();a.exec();}57項(xiàng)目實(shí)施/**函數(shù)名稱:on_btnLogin_clicked()*函數(shù)功能:登錄進(jìn)入主界面*返回值:空*/voidLogin::on_btnLogin_clicked(){QSqlQuerysql;sql.exec("select*fromuserwherename='"+ui->leID->text()+"'andpwd='“+ui->lePW->text()+"'");//根據(jù)用戶名和密碼查找用戶

if(sql.next())//如果條件查找成功則繼續(xù)執(zhí)行以下操作

{exPort=ui->lePort->text();ServerIP=ui->leServerIp->text();Smarta;//新建主界面

this->close();a.exec();}}項(xiàng)目實(shí)施注冊功能主要是用于實(shí)現(xiàn)用戶信息寫入數(shù)據(jù)庫,以此授予用戶權(quán)限提供其具體功能服務(wù),其功能模塊主要由頭文件register.h和源文件register.cpp實(shí)現(xiàn)。其中register.h的具體編寫步驟如下:(1)修改register.h頭文件,在其首部引入登錄功能的頭文件,在代碼#include<QDialog>下一行寫入如下代碼:#include"login.h"(2)在classRegister:publicQDialog函數(shù)的privateslots中對各個(gè)按鈕事件進(jìn)行聲明,其詳細(xì)代碼如下所示:privateslots:voidon_btnClose_clicked();//關(guān)閉按鈕點(diǎn)擊事件voidon_btnRegister_clicked();//注冊按鈕點(diǎn)擊事件58修改注冊功能頭文件和源文件項(xiàng)目實(shí)施59修改注冊功能頭文件和源文件對于注冊功能源文件register.cpp的具體操作如下:(1)在函數(shù)Register::Register(QWidget*parent)中輸入功能代碼,其主要用于去除界面標(biāo)題欄,具體代碼如下:

setWindowFlags(Qt::FramelessWindowHint);//去除窗口標(biāo)題欄項(xiàng)目實(shí)施60修改注冊功能頭文件和源文件(2)在程序尾部插入按鈕事件實(shí)現(xiàn)函數(shù),這些函數(shù)均與頭文件register.h中privateslots中聲明的函數(shù)一一對應(yīng),其主要用于實(shí)現(xiàn)數(shù)據(jù)庫操作的各個(gè)對話框功能,具體代碼如下所示:/**函數(shù)名稱:on_btnClose_clicked()*函數(shù)功能:返回起始界面*返回值:空*/voidRegister::on_btnClose_clicked(){Logina;//新建登錄界面this->close();//關(guān)閉注冊界面a.exec();}61項(xiàng)目實(shí)施/**函數(shù)名稱:on_btnRegister_clicked()*函數(shù)功能:數(shù)據(jù)庫注冊*返回值:空*/voidRegister::on_btnRegister_clicked(){if(ui->leID->text()==""){QMessageBox::critical(this,"注冊失敗","用戶名不能為空","確認(rèn)","取消");//利用基礎(chǔ)對話框提示錯(cuò)誤信息}elseif(ui->lePW->text()==""){QMessageBox::critical(this,"注冊失敗","密碼不能為空","確認(rèn)","取消");//利用基礎(chǔ)對話框提示錯(cuò)誤信息}elseif(ui->lePW2->text()==""){QMessageBox::critical(this,"注冊失敗","確認(rèn)密碼不能為空","確認(rèn)","取消");//利用基礎(chǔ)對話框提示錯(cuò)誤信息}else{QSqlQuerysql;sql.exec("select*fromuserwherename='"+ui->leID->text()+"'");//根據(jù)用戶名查找數(shù)據(jù)庫

62項(xiàng)目實(shí)施if(sql.next()){

}else{if(ui->lePW->text()==ui->lePW2->text())//判斷兩個(gè)密碼框中的信息是否一致{sql.prepare("insertintouservalues(:name,:pwd)");//將用戶名和密碼插入數(shù)據(jù)庫sql.bindValue(":name",ui->leID->text());//將控件中的數(shù)據(jù)綁定到數(shù)據(jù)庫的插入操作中sql.bindValue(":pwd",ui->lePW->text());//將控件中的數(shù)據(jù)綁定到數(shù)據(jù)庫的插入操作中sql.exec();//執(zhí)行插入操作QMessageBox::information(this,"注冊成功","歡迎使用","確認(rèn)","取消");//提示用戶注冊成功}63項(xiàng)目實(shí)施else{QMessageBox::critical(this,"注冊失敗","兩次密碼不同","確認(rèn)","取消");//提示用戶注冊失敗}}}}64項(xiàng)目實(shí)施其中各個(gè)對話框的效果圖如以下圖片所示:項(xiàng)目實(shí)施數(shù)據(jù)瀏覽功能主要是用于查看和刪除用戶注冊信息,其功能模塊主要由頭文件databrowse.h和源文件databrowse.cpp實(shí)現(xiàn)。其中databrowse.h的具體編寫步驟如下:(1)修改databrowse.h頭文件,在其首部引入登錄功能的頭文件,以此實(shí)現(xiàn)功能模塊之間的交互,因此在代碼#include<QDialog>下一行寫入如下代碼:#include"login.h"(2)在classDataBrowse:publicQDialog函數(shù)的privateslots中對各個(gè)按鈕事件進(jìn)行聲明,其詳細(xì)代碼如下所示:privateslots:voidon_btnClose_clicked();//關(guān)閉按鈕點(diǎn)擊事件voidon_btnDelete_clicked();//刪除按鈕點(diǎn)擊事件65修改數(shù)據(jù)瀏覽功能頭文件和源文件項(xiàng)目實(shí)施66修改數(shù)據(jù)瀏覽功能頭文件和源文件對于數(shù)據(jù)瀏覽功能源文件databrowse.cpp的具體操作如下:(1)在函數(shù)DataBrowse::DataBrowse(QWidget*parent)中輸入功能代碼,其主要用于實(shí)現(xiàn)界面中表格信息的填充,并根據(jù)條件判斷是否顯示刪除按鈕,具體代碼如下:

setWindowFlags(Qt::FramelessWindowHint);//去除窗口標(biāo)題欄

QSqlQueryMo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論