《Qt-Creator快速入門》實驗精講_第1頁
《Qt-Creator快速入門》實驗精講_第2頁
《Qt-Creator快速入門》實驗精講_第3頁
《Qt-Creator快速入門》實驗精講_第4頁
《Qt-Creator快速入門》實驗精講_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

《QtCreator32017年2月--PAGE2-目 錄實驗1 Qt開發(fā)環(huán)境的搭-2-目的與要求-2-實驗準備-2-實驗內容-2-實驗2 編譯和發(fā)布Qt程序-12-目的與要求-12-實驗準備-12-實驗內容-12-實驗3 使用Qt資源文件-20-目的與要求-20-實驗準備-20-實驗內容-20-實驗4 創(chuàng)建登陸對話框-26-目的與要求-26-實驗準備-26-實驗內容-26-實驗5 定時器和隨機數-32-目的與要求-32-實驗準備-32-實驗內容-32-6MySQL數據庫驅動35目的與要求-35-實驗準備-35-實驗內容-35-實驗7數據庫基本操作-44-目的與要求-44-實驗準備-44-實驗內容-44-實驗8Qt數據庫應用編程(綜合設計)-50-目的與要求-50-實驗準備-50-實驗內容-50-實驗1 Qt開發(fā)環(huán)境的搭建目的與要求(1)掌握QtSDK安裝方法(2)掌握QtCreator的基本使用方法(3)了解QtCreator的界面布局(4)了解Qt相關工具軟件實驗準備(1)對Qt及QtCreator有基本了解(2)了解MinGW(3)下載Qt5.6.1安裝包實驗內容1.安裝QtCreatorqt-opensource-windows-x86-mingw492-5.6.1-11.1所示的Qt帳號,可以在后面的步驟中創(chuàng)建一個。單擊“下一步”按鈕。圖1.1QtCreator安裝向導QtSkip1.2所示。圖1.2登錄Qt帳號(3)1.3CAssociatecommonfiletypeswithQtCreatorQtCreator關聯(lián)相應類型的文件,以后雙擊相應類型的文件(如Qt項目文件)可直接在QtCreator中打開。這里保持默認設置,單擊“下一步”按鈕。1.3選擇安裝位置(4)在選擇組件界面可以選擇需要安裝的組件,如圖1.4所示,這里一般保持默認即可。圖1.4選擇組件(5)在如圖1.5所示的“許可協(xié)議”界面,選擇接受許可即可。然后單擊“下一步”按鈕。1.5許可協(xié)議界面QtSDK的快捷方式,1.6所示。這里保持默認即可。單擊“下一步”按鈕。1.6設置開始菜單快捷方式(5)在“已做好安裝準備”界面,單擊“安裝”按鈕開始安裝。如圖1.7所示。1.7已做好安裝準備界面LaunchQteaorQteaor。如圖1.8所示。圖1.8完成安裝(7)QtCreator的主界面如圖1.9所示??梢渣c擊各個菜單和功能圖標,對QtCreator界面進行初步了解。圖1.9QtCreator主界面2.運行一個示例程序Qt支持1.10所示。1.10示例程序(2)EmbeddedDialogs示例程序,這時會自動在新窗口打開該示例的幫助文檔,1.11所示。圖1.11示例程序的幫助文檔(3)ConfigureProject1.12所示。1.12選擇構建套件(4)Creator便會自動打開該程序的項1.13所示。1.13示例程序的編輯模式Ctrl+R1.14所示。1.14程序運行效果3查看構建套件打開QtCreator,選擇“工具→選項”菜單項,然后選擇左側的“構建和運行”項。在“構建套件(Kit)DesktopQt5.6.1MinGW32bit的構QtQt版QtCreator1.15所示。1.15查看構建套件--PAGE19-4.查看Qt工具Qt5.6.1中包含了幾個很有用的工具,分別是QtAssistant(Qt助手、QtDesigner(Qt設計師QtLinguist(Qt語言家1.16所示?,F在先來運行這些工具,對其有一個大概了解。圖1.16Qt工具菜單目錄1運行QtAsssantQt助手,如圖1.17所示。圖1.17QtAssistant2運行QtDesnerQt設計師,如圖1.18所示。圖1.18QtDesigner4運行QtnustQt語言家,如圖1.19所示。圖1.19QtLinguist思考題:QtCreator、Qt和MinGW各有什么作用?實驗2 編譯和發(fā)布Qt程序目的與要求(1)掌握創(chuàng)建Qt程序的方法(2)掌握發(fā)布Qt程序的方法(3)Qt程序添加應用程序圖標(4)了解Qt發(fā)布需要的DLL動態(tài)庫文件實驗準備(1)搭建好Qt開發(fā)環(huán)境(2)了解QtCreator設計模式的基本使用方法(3)了解DLL動態(tài)庫文件的作用(4)了解Debug版本和Release版本的區(qū)別實驗內容1.創(chuàng)建helloworld程序(1)QtCreator,打開“文件→新建文件或項目”菜單項(Ctrl+N快捷鍵,在選擇模板頁面選擇Appcaon中的“QtdetsAppcaon”一項,然后單擊“Choose2.1所示。圖2.1選擇模板(2)輸入項目信息。在“項目介紹和位置”頁面輸入項目的名稱為helloworld,然后appsc02212.2所()圖2.2項目介紹與位置DesktopQt5.6.1MinGW32bit1看到的構建套DebugRelease2.3所示。然圖2.3選擇構建套件(4)HelloDialog,QDialogQDialog2.4圖2.4類信息(5)2.5所示。圖2.5項目管理(6)項目建立完成后會直接進入編輯模式。界面的右邊是編輯器,可以閱讀和編輯代碼。l+(l鍵和+號鍵使用l+-減號l++0(數字)可以使字體還原到默認大小。在左邊側邊欄,羅列了項目中的所有文件,如圖2.6所示。圖2.6編輯模式QtCreatorhellodialog.ui文件,2.7所示。圖2.7設計模式標簽Heod!Q2.8所示。2.8添加標簽部件2.運行并發(fā)布程序(1)可以使用快捷鍵Ctrl+R或者通過按下左下角的運行按鈕來運行程序。這時可能會彈出hellodialog.ui文件被修改了(2)程序運行效果如圖2.9所示。圖2.9Helloworld程序運行效果(3)releaseQtCreatorhelloworldrelease版本的編譯,需要在左下角的目標選擇器selector)Release,如2.10所示,然后單擊運行圖標編譯運行程序。2.10目標選擇器(4)編譯完成之后再看項目目錄中:E:\app\src\02\2-1\build-helloworld-Desktop_Qt_5_6_1_MinGW_32bit-Release文件夾的release目錄中,已經生成了helloworld.exe文件。5Qteease文件夾中helloworld.exeQtbinlibgcc_s_dw2-1.dll、libstdc++-6.dll、libwinpthread-1.dll、Qt5Core.dll、Qt5Gui.dllQt5Widgets.dll6個文件復C:\Qt\Qt5.6.1\5.6\mingw49_32\pluginsplatforms文件夾復(qwndows.dl3.設置應用程序圖標在程序發(fā)布時,一般會給可執(zhí)行文件設置一個漂亮的圖標。下面是在Windows系統(tǒng)上設置應用程序圖標的方法。創(chuàng)建.icoicohelloworldmico.coheowod2.1所示。圖2.11helloworld目錄RC_ICONS=myico.ico(2)QtCreator2.12所示。RC_ICONS=myico.ico2.12編輯工程文件(3)運行程序。如圖2.13所示,可以看到窗口左上角的圖標已經更換了。2.13更換了圖標的程序運行界面(4)查看一下release文件夾中的文件,可以看到現在exe文件已經更換了新的圖標,如圖2.14所示。2.14release目錄helloworld.exeQtWindows系統(tǒng)上運行。思考題:Qt程序從編寫、編譯、運行,到最后的發(fā)布,整個流程是怎樣的?--PAGE29-實驗3 使用Qt資源文件目的與要求(1)掌握設置菜單欄方法(2)掌握使用Qt資源文件的方法(3)會使用代碼添加菜單(4)了解資源文件的構成實驗準備(1)搭建好Qt開發(fā)環(huán)境(2)了解使用QtCreator創(chuàng)建Qt應用程序的流程(3)了解應用程序主窗口的組成(4)準備好需要使用的圖標文件實驗內容1.創(chuàng)建主窗口菜單QtWidgetsMainWindow。(2)mainwindow.ui文件進入設計模式??梢钥吹浇缑孀笊辖堑摹霸?)3.1&FAlt圖3.1創(chuàng)建菜單(3)(&N)(3.23.2創(chuàng)建菜單項2.添加菜單圖標Action編輯器中可以看到剛3.3所示。3.3動作編輯器(2)action_NCtrlN,這樣就可以CtrlN3.4所示。圖3.4編輯動作在編輯動作對話框中的圖標后面黑色箭頭下拉框可以選擇使用資源還是使用“OK”按鈕關閉它。3.添加資源文件Qt中可以使用資源文件將各種類型的文件添加到最終生成的可執(zhí)行文件中,這樣就可Qt還會將資源文件進行壓縮,可以使可執(zhí)行文件的體積盡可能縮小。QtQtResource3.5mResouce3.5創(chuàng)建資源文件(2)創(chuàng)建完文件后會自動打開該資源文件,這里需要先在下面添加前綴,點擊添加按鈕,然后選擇前綴,默認的前綴是“newpex1(不要出現中文字符。這里因為要添加圖片,所以修改為/myImages。然后再按下添加按鈕來添加文件,這里最好images文件夾,3.6所示。圖3.6添加圖片(3)當添加完資源后,一定要按下Ctrl+S來保存資源文件,不然在后面可能無法顯示已經添加的資源。4.使用資源文件(1)重新到設計模式打開新建菜單的編輯動作對話框,然后添加圖標。在打開的選擇資源對話框中第一次可能無法顯示已經存在的資源可以按下左上角的綠箭來更新顯示。3.7所示。3.7添加資源圖標(2)點擊這里需要的新建圖標filenew.png,按下“OK”按鈕即可?,F在按下Ctrl+R鍵運行程序,效果如圖3.8所示。圖3.8添加圖標運行效果5.使用代碼來添加菜單和圖標(1)對于添加的資源文件,在項目目錄中可以看到,即myResources.qrc,使用寫字板程序將其打開,可以發(fā)現它其實就是一個XML文檔:<RCC><qresourceprefix="/myImages"><file>images/filenew.png</file><file>images/fileopen.png</file><file>images/filesave.png</file><file>images/filesaveas.png</file><file>images/find.png</file></qresource></RCC>(2)前面是在設計模式添加了圖標文件,下面使用代碼再來添加一個菜單,并為其設置圖標。在編輯模式打開mainwindow.cpp文件,并在構造函數中添加如下代碼:////創(chuàng)建新的動作QAction*openAction=newQAction(tr("&Open"),this);//添加圖標QIconicon(":/myImages/images/fileopen.png");openAction->setIcon(icon);//設置快捷鍵openActionopenAction->setShortcut(QKeySequence(tr("Ctrl+O")));//在文件菜單中設置新的打開動作ui->menu_F->addAction(openAction);objectName屬性。(3)現在運行程序查看效果。思考題:使用資源文件和直接使用本地的圖片文件,這兩種方式有什么優(yōu)缺點?實驗4 創(chuàng)建登陸對話框目的與要求(1)掌握自定義部件類的方法(2)學會使用信號和槽機制(3)了解如何創(chuàng)建登錄對話框(4)了解密碼顯示的方式實驗準備(1)搭建好Qt開發(fā)環(huán)境(2)會使用Qt設計模式設計界面(3)了解信號和槽的基本概念實驗內容編寫程序,實現在程序主界面出現以前,彈出登錄對話框,并可以填寫用戶名和密碼,當按下登錄按鈕,如果用戶名和密碼均正確則進入主窗口,如果有錯則彈出警告對話框。1.創(chuàng)建程序(1)QtWidgets應用,項目名稱為“l(fā)oginMainWindow和QMainWindow不變。2QtDaogwhoutuons,類名更改為“oinDaogabel、兩個行編輯器neditPushButton4.1所示。4.1設計界面效果(3)在屬性編輯器中將用戶名后面的行編輯器的obectNae屬性更改為“usnedtobectNamepwdinedtobectNae屬oinnobectNameetn4.2所示。圖4.2修改對象名稱屬性(4)在設計模式下面的信號和槽編輯器(Signals&SlotsEditor)中,先點擊左上角的綠色exitBtnclicked()LoginDialog,槽為close()。如圖4.3所示。這樣,當單擊退出按鈕時,就會關閉登錄對話框。圖4.3添加信號和槽關聯(lián)5…cced()voidvoidLoginDialog::on_loginBtn_clicked(){accept();}(6)下面到main.cpp文件,更改內容如下:#include<#include<QApplication>#include"mainwindow.h"#include"logindialog.h"intmain(intargc,char*argv[]){QApplicationa(argc,argv);MainWindowMainWindoww;LoginDialogdlg;if(dlg.exec()==QDialog::Accepted){w.show();returna.exec();}elsereturn0;}(7)運行程序,按下退出按鈕會退出程序,按下登錄按鈕會關閉登錄對話框,并顯示主窗口。2.登錄設置(1)下面添加代碼來實現使用用戶名和密碼登錄,這里只是簡單的將用戶名和密碼設置為了固定的字符串。到logindialog.cpp文件中將登錄按鈕的單擊信號對應的槽更改如下:voidvoidLoginDialog::on_loginBtn_clicked(){//判斷用戶名和密碼是否正確,//如果錯誤則彈出警告對話框if(ui->usrLineEdit->text()==tr("yafeilinux")&&ui->pwdLineEdit->text()==tr("123456")){accept();}else{QMessageBox::warning(this,tr("Waring"),tr("usernameorpassworderror!"),QMessageBox::Yes);}}QtQMessageBox表明父窗口是登錄對話框,然后是窗口標題,然后是顯示的內容,按鈕。在logindialog.cpp添加QMessageBox類的頭文件包含,即:#include<QMessageBox> 2)aelnux123564.4所示。圖4.4運行效果(3)logindialog.ui文件進入設echoMode屬性選擇為Password4.5所示。圖4.5修改密碼顯示效果loginDialogsetEchoMode(QLineEdit::Password)函數來設置。(4)在行編輯器的屬性欄中還可以設置占位符,就是沒有輸入信息前的一些提示語句。例如將密碼行編輯器的pacehodt4.6所示。--PAGE39-4.6占位符運行效果(5)對于行編輯器,還有一個問題,比如輸入用戶名,不小心在前面添加了一個空格,這QStringtrimmed()logindialog.cpp文件中登錄按鈕單擊信號關聯(lián)的槽函數中的判斷代碼更改為:if(if(ui->usrLineEdit->text().trimmed()==tr("yafeilinux")&&ui->pwdLineEdit->text()==tr("123456"))這時運行程序,就可以實現相應的功能了。voidLoginDialog::voidLoginDialog::on_loginBtn_clicked(){//判斷用戶名和密碼是否正確,如果錯誤則彈出警告對話框if(ui->usrLineEdit->text().trimmed()==tr("yafeilinux")&&ui->pwdLineEdit->text()==tr("123456")){accept();}else{QMessageBox::warning(this,tr("Waring"),tr("usernameorpassworderror!"),QMessageBox::Yes);//清空內容并定位光標ui->usrLineEdit->clear();ui->pwdLineEdit->clear();ui->usrLineEdit->setFocus();}}下面運行程序并測試效果。思考題:還有沒有其他方式來實現登錄窗口?實驗5 定時器和隨機數目的與要求(1)掌握使用定時器的方法(2)掌握隨機數的設置方法(3)會使用定時器實現時鐘(4)了解圖片顯示的方法實驗準備(1)了解信號和槽的基本使用方法(2)了解定時器和隨機數的基本概念(3)準備好需要使用的圖片文件實驗內容使用定時器可以在指定時間執(zhí)行一些功能,而要實現隨機效果就要使用隨機數來實現。實驗目標為新建程序實現電子時鐘效果,并每隔一秒隨機顯示一張圖片。(1)新建QtWidgets應用,項目名稱為myTimer,基類選擇QWidget,類名為Widget。widget.uiPushButton、LineEditLabel5.1圖5.1設計界面效果(3)然后到widget.h文件中添加類的前置聲明:classQTimer; 再添加一個私有槽聲明:privateprivateslots:voidtimerUpdate();private:private:QTimer*timer;#include<QTimer>#include<QDateTime>#include<QTimer>#include<QDateTime>然后在構造函數中添加如下代碼:timertimer=newQTimer(this);//關聯(lián)定時器溢出信號和相應的槽函數connect(timer,&QTimer::timeout,this,&Widget::timerUpdate);qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));start()函數來開啟定時器。Qtqrand(qsrand(qrand()函數可以產qrand()%100-9100%100,qrand(qsrand()函數為其設置初值,如果不設置初值,那么每次運行程序,qrand()都會產生相同的一組隨機數。為了每次運行qsrand(QTimesecsTo()函數,它表示兩個時間點之間所包含的秒數,比如代碼中就是指從零點整到當前時間所經過的秒數。voidWidget::timerUpdate(){//獲取系統(tǒng)現在的時間QDateTimevoidWidget::timerUpdate(){//獲取系統(tǒng)現在的時間QDateTimetime=QDateTime::currentDateTime();//設置系統(tǒng)時間顯示格式QStringstr=time.toString("yyyy-MM-ddhh:mm:ssdddd");//在標簽上顯示時間ui->lineEdit->setText(str);intrand=qrand5; //50-4ui->label->setPixmap(QString("../myTimer/images/%1.png").arg(rand));}qrand()%55(6)0.png、1.png、2.png、3.png、4.png55imagesclicked()信號。將對應的槽函數修改如下:////開始按鈕voidWidget::on_pushButton_clicked(){timer->start(1000);}//停止按鈕voidWidget::on_pushButton_2_clicked(){timer->stop();}start(10001timeoutstop()函數。5.2圖5.2程序運行效果思考題:怎樣利用隨機數使程序出現隨機效果?6MySQL數據庫目的與要求(1)掌握MySql數據庫的安裝方法(2)掌握MySQL數據庫的簡單操作命令(3)掌握在Qt程序中關聯(lián)MySQL數據庫的方法(4)了解Qt默認支持的數據庫類型實驗準備(1)對MySQL數據庫初步了解(2)了解在Qt中使用MySql數據庫的基本過程(3)了解Qt操作數據庫的基本方法實驗內容1.安裝MySQL(1)從/portal.php?mod=view&aid=10下載MySQL安裝包,具體文件為mysql-5.6.10-win32,如圖6.1所示。圖6.1下載文件(2)運行下載的安裝包,首先出現的是向導歡迎界面。如圖6.2所示。單擊“Next”按鈕。圖6.2歡迎界面(3)該界面選擇同意條款。如圖6.3所示。單擊“Next”按鈕。6.3服務條款界面4usom6.4所示。6.4選擇定制安裝(5)DevelopmentComponents6.5所示。6.5選擇安裝的文件(6)然后選擇下面的“Browse…”按鈕來更改安裝路徑,這里設置為C:\MySQL\,如圖6.6所示。6.6設置安裝位置OKNext6.7所示。圖6.7開始安裝(8)等安裝完畢后,點擊“Finish”按鈕完成安裝。如圖6.8所示。圖6.8完成安裝2.在MySQL中創(chuàng)建數據庫(1)MySQLMyQSL的安C:\MySQL\binmysqld.exe6.9所示。圖6.9運行mysqld程序(2)同時按下鍵盤上的Win圖標和R鍵,在彈出的對話框中輸入cmd。如圖6.10所示。6.10cmd(3)進入終端后輸入下面的命令:cdC:\MySQL\bin 跳轉到安裝目錄下。如圖6.11所示。圖6.11跳轉目錄--PAGE49-(4)然后輸入下面的命令:mysql–uroot–p rootMySQLEnterpassword6.12所示。6.12MySQL(5)登錄MySQL以后,使用下面的命令來查看現有的數據庫:showdatabases; 6.13所示。6.13顯示數據庫(6)可以看到,這里現在已經有幾個數據庫了,它們是MySQL需要的。如圖6.14所示。6.14已有的數據庫mydata的數據庫:createdatabasemydata; 6.15所示。6.15創(chuàng)建數據庫(8)再次查看已經存在的數據庫,發(fā)現顯示出了剛才創(chuàng)建的數據庫,如圖6.16所示。6.16再次查看數據庫(9)完成后,輸入exit命令退出MySQL。3.測試MySQL程序(1)打開Qteaor,新建項目,模板選擇為“QtonsoeAppcaon項目名稱為sqdvessqdves.poQT += sql然后按下Ctrl+S保存該文件。#include<QCoreApplication>#include<QSqlDatabase>#include<QDebug#include<QCoreApplication>#include<QSqlDatabase>#include<QDebug>#include<QStringList>#include<QSqlQuery>intintmain(intargc,char*argv[]){QCoreApplicationa(argc,argv);//輸出可用數據庫qDebug()<<"Availabledrivers:";QStringListdrivers=QSqlDatabase::drivers();foreach(QStringdriver,drivers)qDebug()<<driver;//MySQLQSqlDatabasedb=QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setDatabaseName("mydata");db.setUserName("root");db.setPassword("");if(!db.open())qDebug()<<"Failedtoconnecttorootmysqladmin";elseqDebug()<<"open";QSqlQueryquery(db);//注意這里varchar一定要指定長度,不然會出錯query.exec("createtablestudent(idintprimarykey,namevarchar(20))");query.exec("insertintostudentvalues(1,'xiaogang')");query.exec("insertintostudentvalues(2,'xiaoming')");query.exec("insertintostudentvalues(3,'xiaohong')");query.exec("selectid,namefromstudentwhereid>=2");while(query.next()){intvalue0=query.value(0).toInt();QStringvalue1=query.value(1).toString();qDebug()<<value0<<value1;}returna.exec();}這里注意,創(chuàng)建表時varchar一定要指定長度。C:\MySQL\liblibmysql.dllC:\Qt\Qt5.6.1\5.6\mingw49_32\bin6.17所示。6.17程序運行結果思考題:使用MySQL數據庫要注意哪些事項?7數據庫基本操作目的與要求(1)掌握操作數據庫表格的基本方法(2)掌握使用Qt操作MySQL數據庫的常用操作(3)掌握在MySQL中使用中文的方法(4)了解Qt調用外部程序的基本方法實驗準備(1)安裝完成MySQL數據庫(2)會使用Qt創(chuàng)建MySQL數據庫表(3)了解QSqlTableModel的基本操作實驗內容(1)QtWidgets應用,項目名稱為sqlModelMainWindowQMainWindow。(2)完成后在sqlM文件中添加如下代碼:QTQT += sql然后按下Ctrl+S保存該文件。(3)往項目中添加新的+頭文件,名稱為“conncon.h##ifndefCONNECTION_H#defineCONNECTION_H#include<QMessageBox>#include<QSqlDatabase>#include<QSqlQuery>staticboolcreateConnection(){QSqlDatabasedb=QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setDatabaseName("mydata");db.setUserName("root");db.setPassworddb.setPassword("");if(!db.open()){QMessageBox::critical(0,QObject::tr("無法打開數據庫"),"無法創(chuàng)建數據庫連接!",QMessageBox::Cancel);returnfalse;}//下面來創(chuàng)建表//MySQL數據庫中已經存在同名的表,那么下面的代碼不會執(zhí)行QSqlQueryquery(db);//使數據庫支持中文query.exec("SETNAMES'Latin1'");//course表query.exec("createtablecourse(idintprimarykey,""namevarchar(20),teachervarchar(20))");query.exec("insertintocoursevalues(0,'數學','劉老師')");query.exec("insertintocoursevalues(1,'英語','張老師')");query.exec("insertintocoursevalues(2,'計算機','白老師')");returntrue;}#endif//CONNECTION_H#include<QApplication>#include"mainwindow.h"#include"connection.h#include<QApplication>#include"mainwindow.h"#include"connection.h"#include<QProcess>intmain(intargc,char*argv[]){QApplicationa(argc,argv);//MySQL數據庫QProcessprocess;process.start("C:/MySQL/bin/mysqld.exe");if(!createConnection())return1;MainWindoww;w.show();returnreturna.exec();}(5)雙擊mainwindow.ui文件進入設計模式,向界面上拖入Label、PushButton、LineEdit和TableView等部件,最終效果如圖7.1所示。7.1設計界面效果(6)打開mainwindow.h文件,添加類的前置聲明:classQSqlTableModel; private:QSqlTableModelprivate:QSqlTableModel*model;#include<QSqlQuery>#include<QSqlTableModel>#include<QSqlError#include<QSqlQuery>#include<QSqlTableModel>#include<QSqlError>#include<QMessageBox>在構造函數中添加如下代碼:modelmodel=newQSqlTableModel(this);model->setTable("course");model->select();//設置編輯策略model->setEditStrategy(QSqlTableModel::OnManualSubmit);ui->tableView->setModel(model);8ccked()////提交修改按鈕voidMainWindow::on_pushButton_clicked(){//開始事務操作model->database().transaction();if(model->submitAll()){model->database().commit();//提交}else{model->database().rollback();//回滾QMessageBox::warning(this,tr("tableModel"),tr("數據庫錯誤:%1").arg(model->lastError().text()));}}//撤銷修改按鈕voidMainWindow::on_pushButton_2_clicked(){model->revertAll();}//查詢按鈕,進行篩選voidMainWindow::on_pushButton_7_clicked(){QStringname=ui->lineEdit->text();//根據姓名進行篩選,一定要使用單引號model->setFilter(QString("teacher='%1'").arg(name));model->select();}//顯示全表按鈕voidMainWindow::on_pushButton_8_clicked(){model->setTable("course");model->select();}//id升序排列按鈕voidMainWindow::on_pushButton_5_clicked(){//id屬性,即第0列,升序排列model->setSort(0,Qt::AscendingOrder);model->select();}//id降序排列按鈕voidMainWindow::on_pushButton_6_clicked(){{model->setSort(0,Qt::DescendingOrder);model->select();}//刪除選中行按鈕voidMainWindow::on_pushButton_4_clicked(){//獲取選中的行intcurRow=ui->tableView->currentIndex().row();//刪除該行model->removeRow(curRow);intok=QMessageBox::warning(this,tr("刪除當前行!"),tr("你確定刪除當前行嗎?"),QMessageBox::Yes,QMessageBox::No);if(ok==QMessageBox::No)//如果不刪除,則撤銷model->revertAll();}else{//否則提交,在數據庫中刪除該行model->submitAll();}}//添加記錄按鈕voidMainWindow::on_pushButton_3_clicked(){//獲得表的行數introwNum=model->rowCount();//添加一行model->insertRow(rowNum);model->setData(model->index(rowNum,0),rowNum);}97.3所id默d值加17.4naeeacher7.57.6idid7.7所示。圖7.2程序運行效果 圖7.3提交修改圖7.4添加記錄 圖7.5提交添加的記錄圖7.6查詢效果 圖7.7排序效果思考題:使用其他數據庫重寫編寫該程序,思考Qt操作數據庫與數據庫類型有關嗎?--PAGE59-實驗8Qt數據庫應用編程(綜合設計)目的與要求(1)掌握創(chuàng)建綜合應用程序的方法(2)掌握設計數據庫程序的方法(3)掌握綜合程序的布局方法(4)了解模塊化編寫應用程序的方法實驗準備(1)安裝完成MySQL數據庫(2)會使用Qt創(chuàng)建MySQL數據庫表(3)了解應用程序界面布局的方法(4)會使用常用的Qt部件實驗內容實驗的目標實驗步驟1.創(chuàng)建程序1新建QtdetsmanaerQdetdet”不變。(2)750500,windowTitle屬PushButtonStackedWidget,將其寬度700和410cuenaeNaeseaeacedWidgetsellPageLabelLabel的顯示文本更改為“出售商fontframeShapealignmentAlignHCenterLabelComboBoxLineEdit、SpinBoxPushButton8.1所示。8.1出售商品界面(3)下面來更改部分部件的objectName屬性,如表8.1所示。8.1objectName屬性部件objectName屬性“出售商品”PushButtonsellBtn“商品入庫”PushButtonbuyBtn“添加商品”PushButtonaddBtn“商品查詢”PushButtonqueryBtn“修改密碼”PushButtonpasswordBtnobooxsellTypeComboBoxobooxsellBrandComboBoxineEditsellPriceLineEditSpinoxsellNumSpinBox“剩余數量:000”LabelsellLastNumLabelineEditsellSumLineEdit“確定”PushButtonsellOkBtn“取消”PushButtonsellCancelBtn(4)StackedWidget8.2objectName8.2所示。8.2商品入庫界面表8.2商品入庫頁面部件的objectName屬性部件objectName屬性obooxgoodsTypeComboBoxobooxgoodsBrandComboBoxineEditgoodsPriceLineEditSpinoxgoodsNumSpinBoxineEditgoodsSumLineEdit“確定”PushButtongoodsOkBtn“取消”PushButtongoodsCancelBtn(5)再次插入新的頁面,效果如圖8.3所示。部分部件的objectName屬性如表8.3所示。8.3添加商品界面表8.3添加商品頁面部件的objectName屬性部件objectName屬性obooxnewTypeComboBoxlineEditnewBrandLineEditSpinoxnewPriceSpinBoxSpinoxnewNumSpinBoxineEditnewSumLineEdit“確定”PushButtonnewOkBtn“取消”PushButtonnewCancelBtn(6)再次插入新的頁面,拖入Label、ComboBox、PushButton和TableView等部件,效果如圖8.4所示。部分部件的objectName屬性如表8.4所示。8.4商品查詢界面8.4objectName屬性部件objectName屬性obooxqueryTypeComboBoxobooxqueryBrandComboBox“查詢”PushButtonqueryPushButton(7)再次插入新的頁面,效果如圖8.5所示。部分部件的objectName屬性如表8.5所示。8.5修改密碼界面8.5objectName屬性部件objectName屬性“原密碼”后面的LineEditoldPwdLineEdit“新密碼”后面的LineEditnewPwdLineEdit“確定”PushButtonchangePwdBtn2.連接數據庫QT +=sql(1)在項目文件QT +=sql(2)往項目中添加新的C++頭文件connection.h,完成后將其內容更改如下:##ifndefCONNECTION_H#defineCONNECTION_H#include<QMessageBox>#include<QSqlDatabase>#include<QSqlQuery>staticboolcreateConnection(){QSqlDatabasedb=QSqlDatabase::addDatabase("QMYSQL");db.setHostName("localhost");db.setDatabaseName("mydata");db.setUserName("root");db.setPassworddb.setPassword("");if(!db.open()){QMessageBox::critical(0,QObject::tr("無法打開數據庫"),"無法創(chuàng)建數據庫連接!",QMessageBox::Cancel);returnfalse;}QSqlQueryquery;//使數據庫支持中文query.exec("SETNAMES'Latin1'");//創(chuàng)建分類表query.exec("createtabletype(idvarchar(20)primarykey,namevarchar(20))");query.exec("insertintotypevalues('0','請選擇類型')");query.exec("insertintotypevalues('01','電視')");query.exec("insertintotypevalues('02','空調')");//創(chuàng)建品牌表query.exec("createtablebrand(idvarchar(20)primarykey,namevarchar(30),""typevarchar(20),priceint,sumint,sellint,lastint)");query.exec("insertintobrandvalues('01','海信','電視',3699,50,10,40)");query.exec("insertintobrandvalues('02','創(chuàng)維','電視',3499,20,5,15)");query.exec("insertintobrandvalues('03','海爾','電視',4199,80,40,40)");query.exec("insertintobrandvalues('04','王牌','電視',3999,40,10,30)");query.exec("insertintobrandvalues('05','海爾','空調',2899,60,10,50)");query.exec("insertintobrandvalues('06','格力','空調',2799,70,20,50)");//創(chuàng)建密碼表query.exec("createtablepassword(idvarchar(20)primarykey,pwdvarchar(50))");query.exec("insertintopasswordvalues('01','123456')");returntrue;}#endif//CONNECTION_H(3)下面進入main.cpp文件,修改如下:#include<#include<QApplication>#include"widget.h"#include"connection.h"#include"logindialog.h"#include<#include<QProcess>intmain(intargc,char*argv[]){QApplicationa(argc,argv);//這里使用代碼來運行MySQL數據庫QProcessprocess;process.start("C:/MySQL/bin/mysqld.exe");if(!createConnection())return0;Widgetw;LoginDialogdlg;if(dlg.exec()==QDialog::Accepted){w.show();returna.exec();}else{return0;}}這里使用了LoginDialog類,這個是登陸窗口類,下面來創(chuàng)建這個類。3.添加登陸窗口類(1)向項目中添加新的Qt設計師界面類,模板選擇DialogwithoutButtons,類名設置為oinDaogushuon、nedt和abel8.6nedt的obecNaepwdnedtechoode選擇為asswodobecNaeoinnobecNamequn8.6登陸窗口界面(2)下面進入logindialog.cpp文件中,先添加頭文件包含:#include<#include<QMessageBox>#include<QSqlQuery>然后在構造函數中添加如下代碼:setFixedSizesetFixedSize(700,400);setWindowTitle(tr("登錄"));ui->pwdLineEdit->setFocus();ui->loginBtn->setDefault(true);voidvoidLoginDialog::on_loginBtn_clicked(){if(ui->pwdLineEdit->text().isEmpty()){QMessageBox::information(this,tr("請輸入密碼"),tr("請先輸入密碼再登錄!"),QMessageBox::Ok);ui->pwdLineEdit->setFocus();}else{QSqlQueryquery;query.exec("selectpwdfrompassword");query.next();if(query.value(0).toString()==ui->pwdLineEdit->text()){QDialog::accept();}else{QMessageBox::warning(this,tr("密碼錯誤"),tr("請輸入正確的密碼再登錄!"),QMessageBox::Ok);ui->pwdLineEdit->clear();ui->pwdLineEdit->setFocus();}}}voidLoginDialog::on_quitBtn_clicked(){QDialog::reject();}QDialog::accept()函數,該函數會隱藏AcceptedQDialog::reject()函數,該Rejected。這里使用了對話框的返回值來進行判斷,如果返回值為QDialog::Accepted,則顯示主界面,否則退出程序4.實現功能widget.uiccked////出售商品按鈕voidWidget::on_sellBtn_clicked(){ui->stackedWidget->setCurrentIndex(0);}//商品入庫按鈕voidWidget::on_buyBtn_clicked(){ui->stackedWidget->setCurrentIndex(1);}//添加商品按鈕voidWidget::on_addBtn_clicked(){ui->stackedWidget->setCurrentIndex(2);}//商品查詢按鈕voidWidget::on_queryBtn_clicked(){ui->stackedWidget->setCurrentIndex(3);}//修改密碼按鈕voidWidget::on_passwordBtn_clicked(){ui->stackedWidget->setCurrentIndex(4);}(2)在各個頁面上首先是選擇商品的類型,當商品類型改變時會自動修改品牌列表。分別進ComboBoxcurrentIndexChanged(QString)信號,更改各個槽函數如下:////出售商品的商品類型改變時voidWidget::on_sellTypeComboBox_currentIndexChanged(QStringtype){if(type=="請選擇類型"){//進行其他部件的狀態(tài)設置on_sellCancelBtn_clicked();}else{ui->sellBrandComboBox->setEnabled(true);QSqlQueryModel*sellBrandModel=newQSqlQueryModel(this);sellBrandModel->setQuery(QString("selectnamefrombrandwheretype='%1'").arg(type));ui->sellBrandComboBox->setModel(sellBrandModel);ui->sellCancelBtn->setEnabled(true);}}//已有商品入庫的商品類型改變時voidWidget::on_goodsTypeComboBox_currentIndexChanged(QStringtype){if(type=="請選擇類型"){//進行其他部件的狀態(tài)設置on_goodsCancelBtn_clicked();}else{ui->goodsBrandComboBox->setEnabled(true);QSqlQueryModel*goodBrandModel=newQSqlQueryModel(this);goodBrandModel->setQuery(QString("selectnamefrombrandwheretype='%1'").arg(type));ui->goodsBrandComboBox->setModel(goodBrandModel);ui->goodsCancelBtn->setEnabled(true);}}//新商品入庫類型改變時voidWidget::on_newTypeComboBox_currentIndexChanged(QStringtype){if(type=="請選擇類型"){//進行其他部件的狀態(tài)設置on_newCancelBtn_clicked();}else{ui->newBrandLineEdit->setEnabled(true);ui->newBrandLineEdit->setFocus();}}//查詢商品類型改變時voidWidget::on_queryTypeComboBox_currentIndexChanged(constQStringtype)--PAGE69-{{if(type=="請選擇類型"){ui->queryBrandComboBox->setEnabled(false);}else{ui->queryBrandComboBox->setEnabled(true);QSqlQueryModel*brandModel=newQSqlQueryModel(this);brandModel->setQuery(QString("selectnamefrombrandwheretype='%1'").arg(type));ui->queryBrandComboBox->setModel(brandModel);}}(3)類似的,當商品品牌改變時要查詢相應的內容,分別進入各個頁面,右擊品牌后面的ombooxcuenndeChanedQSn)信號,更改各個槽函數如下:////出售商品的品牌改變時voidWidget::on_sellBrandComboBox_currentIndexChanged(QStringbrand){ui->sellNumSpinBox->setValue(0);ui->sellNumSpinBox->setEnabled(false);ui->sellSumLineEdit->clear();ui->sellSumLineEdit->setEnabled(false);ui->sellOkBtn->setEnabled(false);QSqlQueryquery;query.exec(QString("selectpricefrombrandwherename='%1'andtype='%2'").arg(brand).arg(ui->sellTypeComboBox->currentText()));query.next();ui->sellPriceLineEdit->setEnabled(true);ui->sellPriceLineEdit->setReadOnly(true);ui->sellPriceLineEdit->setText(query.value(0).toString());query.exec(QString("selectlastfrombrandwherename='%1'andtype='%2'").arg(brand).arg(ui->sellTypeComboBox->currentText()));query.next();intnum=query.value(0).toInt();if(num==0){QMessageBox::information(this,tr("提示"),tr("該商品已經售完!"),QMessageBox::Ok);}else{ui->sellNumSpinBox->setEnabled(true);ui->sellNumSpinBox->setMaximum(num);ui->sellLastNumLabel->setText(tr("剩余數量:%1").arg(num));uiui->sellLastNumLabel->setVisible(true);}}//已有商品入庫的品牌改變時voidWidget::on_goodsBrandComboBox_currentIndexChanged(QStringbrand){ui->goodsNumSpinBox->setValue(0);ui->goodsNumSpinBox->setEnabled(true);ui->goodsSumLineEdit->clear();ui->goodsSumLineEdit->setEnabled(false);ui->goodsOkBtn->setEnabled(false);QSqlQueryquery;query.exec(QString("selectpricefrombrandwherename='%1'andtype='%2'").arg(brand).arg(ui->goodsTypeComboBox->currentText()));query.next();ui->goodsPriceLineEdit->setEnabled(true);ui->goodsPriceLineEdit->setReadOnly(true);ui->goodsPriceLineEdit->setText(query.value(0).toString());}//新商品品牌改變時voidWidget::on_newBrandLineEdit_textChanged(QStringstr){if(str==""){ui->newCancelBtn->setEnabled(false);ui->newPriceSpinBox->setEnabled(false);ui->newNumSpinBox->setEnabled(false);ui->newSumLineEdit->setEnabled(false);ui->newSumLineEdit->clear();ui->newOkBtn->setEnabled(false);}else{ui->newCancelBtn->setEnabled(true);ui->newPriceSpinBox->setEnabled(true);ui->newNumSpinBox->setEnabled(true);ui->newSumLineEdit->setEnabled(true);qrealsum=ui->newPriceSpinBox->value()*ui->newNumSpinBox->value();ui->newSumLineEdit->setText(QString::number(sum));ui->newOkBtn->setEnabled(true);}}(4)當商品數量改變時,也要進行相應的操作,分別進入各個頁面,右擊數量后面的Spinoxauehanednt)////出售商品數量改變時voidWidget::on_sellNumSpinBox_valueChanged(intvalue){if(value==0){ui->sellSumLineEdit->clear();ui->sellSumLineEdit->setEnabled(false);ui->sellOkBtn->setEnabled(false);}else{ui->sellSumLineEdit->setEnabled(true);ui->sellSumLineEdit->setReadOnly(true);qrealsum=value*ui->sellPriceLineEdit->text().toInt();ui->sellSumLineEdit->setText(QString::number(sum));ui->sellOkBtn->setEnabled(true);}}//已有商品入庫數量改變時voidWidget::on_goodsNumSpinBox_valueChanged(intvalue){if(value==0){ui->goodsSumLineEdit->clear();ui->goodsSumLineEdit->setEnabled(false);ui->goodsOkBtn->setEnabled(false);}else{ui->goodsSumLineEdit->setEnabled(true);ui->goodsSumLineEdit->setReadOnly(true);qrealsum=value*ui->goodsPriceLineEdit->text().toInt();ui->goodsSumLineEdit->setText(QString::number(sum));ui->goodsOkBtn->setEnabled(true);}}//新商品數量改變時voidWidget::on_newNumSpinBox_valueChanged(intvalue){qrealsum=value*ui->newPriceSpinBox->value();ui->newSumLineEdit->setText(QString::number(sum));ui->newOkBtn->setEnabled(true);}(5)SpinBox,選auehanednt)////新商品單價改變時voidWidget::on_newPriceSpinBox_valueChanged(intvalue){qrealsum=value*ui->newNumSpinBox->value();ui->newSumLineEdit->setText(QString::number(sum));ui->newOkBtn->setEnabled(true);}(6)各個頁面的確定按鈕按下時要通過操作數據庫執(zhí)行一定的操作,下面分別右擊各個頁ccked////出售商品的確定按鈕voidWidget::on_sellOkBtn_clicked(){QStringtype=ui->sellTypeComboBox->currentText();QStringname=ui->sellBrandComboBox->currentText();intvalue=ui->sellNumSpinBox->value();//cellNumSpinBox的最大值就是以前的剩余量intlast=ui->sellNumSpinBox->maximum()-value;QSqlQueryquery;//獲取以前的銷售量query.exec(QString("selectsellfrombrandwherename='%1'andtype='%2'").arg(name).arg(type));query.next();intsell=query.value(0).toInt()+value;//事務操作QSqlDatabase::

溫馨提示

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

評論

0/150

提交評論