Qt实现一个简单的应用程序——桌面助手
一、軟件功能及涉及知識(shí)
1、實(shí)現(xiàn)不同功能之間的界面切換
2、可查看日歷
3、可實(shí)現(xiàn)計(jì)時(shí)器功能
4、可實(shí)現(xiàn)計(jì)算器功能
5、ui界面及按鈕部件背景的設(shè)置
6、為軟件設(shè)置圖標(biāo)
7、程序打包成軟件
二、效果演示
?
?
?
?三、實(shí)現(xiàn)過程
1、創(chuàng)建工程
? ? ? ? New Project -> Application -> Qt Widgets Application然后下一步,使用ui界面文件能省去很多步驟。
?點(diǎn)擊下一步、完成就創(chuàng)建好了一個(gè)包含.h、.cpp、.ui文件的工程。
因?yàn)槲覀冊诓煌慕缑嫔戏謩e實(shí)現(xiàn)查看日歷、計(jì)時(shí)器、計(jì)算器的功能,所以還需要在工程里創(chuàng)建兩個(gè).h、.cpp、.ui文件,過程如下。
?
?直接下一步、完成就創(chuàng)建成功,在以同樣的方式添加一個(gè)類名為MainWindow3的文件,結(jié)果如下。
2、工程創(chuàng)建成功,開始實(shí)現(xiàn)功能
首先要確定好在哪個(gè)文件里實(shí)現(xiàn)什么功能,我這里是在MainWindow里實(shí)現(xiàn)查看日歷功能,在MainWindow2里面實(shí)現(xiàn)計(jì)時(shí)器功能,在MainWindow3里面實(shí)現(xiàn)計(jì)算器功能。
然后就在對應(yīng)的文件里去添加需要的控件并對界面進(jìn)行合適的布局(這樣到時(shí)候控件就能隨著窗口的大小而變化),我的布局如下。
日歷界面:
?計(jì)時(shí)器界面:
計(jì)算器界面:
?需要注意每個(gè)控件對象的名稱要記住不能搞混,可以在右下角的屬性面板對應(yīng)的objectName里查看或修改,但控件要顯示的名字或內(nèi)容可以直接點(diǎn)擊控件編輯。
3、準(zhǔn)備好這一切我們就開始編寫程序
第一步、先實(shí)現(xiàn)實(shí)現(xiàn)三個(gè)界面之間可以相互切換
在上一步添加按鈕的時(shí)候,可以直接右鍵點(diǎn)擊對應(yīng)的按鈕,然后點(diǎn)擊轉(zhuǎn)到槽,因?yàn)橐獙?shí)現(xiàn)點(diǎn)擊按鈕的時(shí)候發(fā)現(xiàn)對應(yīng)的反應(yīng),所以下一步選擇clicked(),最后點(diǎn)擊ok就會(huì)在.cpp文件中生成對應(yīng)按鈕的槽函數(shù),還會(huì)在.h頭文件里自動(dòng)申明,我們只需要在槽函數(shù)里添加要實(shí)現(xiàn)的功能的代碼就可以了,代碼如下。
mainwindow.cpp
void MainWindow::on_pushButton_clicked()//計(jì)時(shí)器按鈕生成的槽函數(shù) {MainWindow2 *mainwindow2=new MainWindow2;//為 MainWindow2 窗口創(chuàng)建一個(gè)名字,方便操作它this->close();//點(diǎn)擊計(jì)時(shí)器按鈕時(shí)關(guān)閉當(dāng)前界面mainwindow2->show();//打開窗口 mainwindow2(計(jì)時(shí)器)界面 }void MainWindow::on_pushButton_4_clicked()//計(jì)算器按鈕的槽函數(shù) {MainWindow3 *mainwindow3=new MainWindow3;this->close();//點(diǎn)擊計(jì)算器按鈕時(shí)關(guān)閉當(dāng)前界面mainwindow3->show();//打開窗口 mainwindow3(計(jì)算器)界面 }mainwindow2.cpp
void MainWindow2::on_pushButton_clicked()//日歷按鈕生成的槽函數(shù) {MainWindow *mainwindow=new MainWindow;this->close();//點(diǎn)擊日歷按鈕后關(guān)閉當(dāng)前界面mainwindow->show();//進(jìn)入mainwindow(日歷)界面 }void MainWindow2::on_pushButton_2_clicked()//計(jì)算器按鈕的槽函數(shù) {MainWindow3 *mainwindow3=new MainWindow3;this->close();//點(diǎn)擊計(jì)算器按鈕后關(guān)閉當(dāng)前界面mainwindow3->show();//進(jìn)入mainwindow3(計(jì)算器)界面 } }mainwindow3.cpp
void MainWindow3::on_pushButton_clicked()//日歷按鈕的槽函數(shù) {MainWindow2 *mainwindow2=new MainWindow2;this->close();//點(diǎn)擊計(jì)時(shí)器按鈕時(shí)關(guān)閉當(dāng)前界面mainwindow2->show();//打開mainwindow2(計(jì)時(shí)器)界面 }void MainWindow3::on_pushButton_3_clicked()//計(jì)時(shí)器按鈕生成的槽函數(shù) {MainWindow *mainwindow=new MainWindow;this->close();//點(diǎn)擊日歷按鈕時(shí)關(guān)閉當(dāng)前界面mainwindow->show();//打開mainwindow(日歷)界面 }不要忘了需要在對應(yīng)的文件里添加需要切換界面對應(yīng)的頭文件。
第二步、每個(gè)窗口對應(yīng)的功能
日歷界面的功能比較簡單,只是顯示日歷,只需要在ui文件中添加一個(gè)Calendar Widget部件就可以了。?
計(jì)時(shí)器界面需要使用到QTimer類,需要添加代碼如下。
mainwindow2.h
#include <QTime> #include <QTimer> QTime *time; QTimer *timer;mainwindow2.cpp
time = new QTime; timer = new QTimer;//創(chuàng)建一個(gè)定時(shí)器 ui->Timer->setDigitCount(8);//數(shù)碼管需要顯示8個(gè) initTime(); connect(timer,SIGNAL(timeout()),this,SLOT(updateTime()));//信號(hào)與槽 connect(ui->pbStart,SIGNAL(clicked()),this,SLOT(pbStart_clicked()));//信號(hào)與槽 void MainWindow2::initTime()// {time->setHMS(0,0,0);//設(shè)置初值ui->Timer->display(time->toString("hh:mm:ss")); } void MainWindow2::updateTime()//開始計(jì)時(shí) {*time=time->addSecs(1);//每次增加1ui->Timer->display(time->toString("hh:mm:ss")); } void MainWindow2::pbStart_clicked()//start按鈕生成的槽函數(shù) {if(QString::compare(ui->pbStart->text(),"stop")){initTime();//每次開始前初始化timer->start(1000);//每次增加時(shí)間為一秒ui->pbStart->setText("stop");}else{timer->stop();ui->pbStart->setText("start");//initTime();} }計(jì)算器界面,按鍵比較多,設(shè)置按鍵類名的時(shí)候盡量設(shè)計(jì)的與它的功能相近,不然寫功能的時(shí)候可能會(huì)寫亂,然后按鈕轉(zhuǎn)到槽,再編寫每個(gè)按鈕對應(yīng)的功能,由于該部分代碼比較多部分代,這里先展示一部分,完整代碼后面打包發(fā)出。
mainwindow3.h
//在私有成員變量里定義號(hào)需要用到的變量 QString process; float result; QString S; QString Sresult; float sum; int choose; int stat; int dot;mainwindow3.cpp
ui->textEdit_show->setText("請輸入:");//開始時(shí)輸入框中顯示“請輸入:” //初始化定義好的變量process="";result = 0;S = "";stat = 0;choose = 0;sum = 0;dot = 0; void MainWindow3::on_pushButton_zero_clicked()//按鈕0生成的槽函數(shù),點(diǎn)擊0時(shí)在原來的內(nèi)容上加上數(shù)字0 {if (-1 == stat){result = sum;on_pushButton_clear_clicked();}if (0 == choose){S += "0";ui->textEdit_show->setText(S);}else if (0 != choose){process += "0";ui->textEdit_show->setText(process);} }數(shù)字按鈕1~9的功能代碼相似,都是在原來的內(nèi)容上加上對應(yīng)的數(shù)字。
void MainWindow3::on_pushButton_sum_clicked()//實(shí)現(xiàn)加法 {if (0 == stat || -1 == stat){ui->textEdit_show->append("+");}sum = result;stat = 1;choose = 1;dot = 0; }void MainWindow3::on_pushButton_sub_clicked()//減法 {if (0 == stat || -1 == stat){ui->textEdit_show->append("-");}sum = result;stat = 1;choose = 2;dot = 0; }void MainWindow3::on_pushButton_mul_clicked()//乘法 {if (0 == stat || -1 == stat){ui->textEdit_show->append("*");}sum = result;stat = 1;choose = 3;dot = 0; }void MainWindow3::on_pushButton_div_clicked()//除法 {if (0 == stat || -1 == stat){ui->textEdit_show->append("/");}sum = result;stat = 1;choose = 4;dot = 0; }void MainWindow3::on_pushButton_dot_clicked()//小數(shù)點(diǎn) {if (0 == dot){if (0 == choose){S += ".";ui->textEdit_show->setText(S);}else if (0 != choose){process += ".";ui->textEdit_show->setText(process);}}stat = 1;dot = 1; }void MainWindow3::on_pushButton_equal_clicked()//等于 {switch (choose) {case 1:result += S.toFloat() + process.toFloat();sum = result;Sresult = QString("%1").arg(result);ui->textEdit_show->setText(Sresult);break;case 2:result += S.toFloat() - process.toFloat();sum = result;Sresult = QString("%1").arg(result);ui->textEdit_show->setText(Sresult);break;case 3:if (0 == sum){result = 1;}else{result = sum;}if (S.toFloat()*process.toFloat() != 0){result*= S.toFloat()*process.toFloat();qDebug() << result << "" << sum;}else{result*= (S.toFloat() + process.toFloat());qDebug() << result << "" << sum;}sum = result;Sresult = QString("%1").arg(result);ui->textEdit_show->setText(Sresult);break;case 4:if (0 == process.toFloat()){ui->textEdit_show->setText("system error!");QTimer::singleShot(1000,this,SLOT(on_pushButton_clear_clicked()));break;}if (0 == sum){result = 1;}else{result = sum;}if (S.toFloat()/process.toFloat() != 0){result = S.toFloat()/process.toFloat();qDebug() << result << "" << sum;}else{result /= (S.toFloat() + process.toFloat());qDebug() << result << "" << sum;}sum = result;Sresult = QString("%1").arg(result);ui->textEdit_show->setText(Sresult);break;}sum = result;stat = -1;//如果剛按了等號(hào)又按數(shù)字,相當(dāng)于做一次AC,如果按了等號(hào)再按加號(hào),就繼續(xù)計(jì)算choose = 0;//告訴程序類重新接受運(yùn)算符S = "";process = "";//因?yàn)橐B續(xù)計(jì)算,所以不將過程值清零 }void MainWindow3::on_pushButton_backspace_clicked()//退格 {if (0 == choose){S.chop(1);//退一格ui->textEdit_show->setText(S);}else if (0 != choose){process.chop(1);ui->textEdit_show->setText(process);} }void MainWindow3::on_pushButton_clear_clicked()//清零 {result = 0;S = "";process = "";stat = 0;choose = 0;ui->textEdit_show->setText("請輸入:");dot = 0; }void MainWindow3::on_pushButton_exit_clicked()//退出 {close();//直接關(guān)閉當(dāng)前界面 }第三步、對每個(gè)窗口和控件進(jìn)行美化
給每個(gè)界面設(shè)置一個(gè)背景圖片,首先和添加ui/h文件的方式相似,鼠標(biāo)右擊工程,添加新文件,后面步驟如下。
?接著下一步、完成,然后右擊剛才生成的文件 -> 添加現(xiàn)有文件 -> 自動(dòng)打開文件之后,在里面新建一個(gè)文件,選擇它打開并在里面放如我們想用的背景圖片點(diǎn)擊打開后選擇Yes to All。
?
?目錄上就有了剛剛選擇的圖片。
?有了圖片就可以到ui文件去進(jìn)行設(shè)置,右擊界面的空白處 -> 改變樣式表 -> 下拉添加資源選擇background-image -> Picture->選擇圖片 -> OK。
添加#MainWindow2表示設(shè)置為該界面主窗口的背景。
?
?然后還可以設(shè)置一下按鈕的背景或顏色,做法和設(shè)置界面背景一樣但設(shè)置顏色的話就下拉添加顏色。
?第四步、為軟件添加一個(gè)圖標(biāo),使他看起來更像一個(gè)應(yīng)用程序。
注意圖標(biāo)必須是以ioc為后綴的圖片,操作方式如下。
在工程目錄里添加我們想要的圖標(biāo)。
在.pro文件中進(jìn)行以下操作。
?到這里,程序就完成的差不多了。
四、將程序打包成軟件
1、把工程編譯模式從debug調(diào)到release模式下,然后編譯。
?2、找到工程存放位置下,有一個(gè)release的文件夾,子文件下有個(gè)release的文件,其中就會(huì)生成一個(gè)后綴為exe的可執(zhí)行文件。
3、進(jìn)行封包操作,將運(yùn)行程序和它需要的動(dòng)態(tài)鏈接庫封裝在一起。步驟:
(1)、在英文路徑下創(chuàng)建一個(gè)文件夾aaa(文件夾名稱也要是英文的),然后找到剛才編譯生成的exe文件,并將它拷貝到新創(chuàng)建的文件aaa下。(如果你雙擊執(zhí)行這個(gè)程序,你會(huì)發(fā)現(xiàn)系統(tǒng)提示沒有缺少的dll文件)
(2)、利用QT的windeployqt工具導(dǎo)入程序所需要的文件和資源。(這個(gè)程序可以直接在電腦右下角搜索qt,選擇有一個(gè)黑色面板的那個(gè))
?在這之前需要先復(fù)制一份剛剛新建的文件夾aaa的錄進(jìn)。
?
?然后先進(jìn)入文件所在的系統(tǒng)盤,我是放在桌面的就去c盤,c:加上回車鍵就可以了。
然后粘貼上剛才復(fù)制的文件路徑回車。
?
?在路徑后面加上“windeployqt 程序名.exe”,回車進(jìn)行封包操作
?3、打包完成后,就和我們平時(shí)看到的軟件一樣了,可以在文件夾下直接打開那個(gè)文件了。
?4、如果覺得文件太多,我們可以使用第三方工具將所有文件打包成一個(gè),我這里使用的是Enigma Virtual Box。
先找到文件并打開。
?下一步。
?選擇裝整個(gè)程序的文件夾并確認(rèn)。
?
?
?點(diǎn)擊Files Ootions后勾上Compress? Files可以將文件壓縮小一點(diǎn)。
?最后點(diǎn)擊Process開始打包成一個(gè)文件。
?
?最后直接關(guān)閉,我們就可以在原來程序的文件里看到一個(gè)大概20兆的應(yīng)用程序,就是剛才打包好的一個(gè)完整的應(yīng)用程序(我這里將它重命名了桌面助手),可以直接放在桌面上打開。
?
?
五、總結(jié)
?到這里這個(gè)應(yīng)用程序就算是徹底完成了,通過這個(gè)項(xiàng)目也讓我學(xué)習(xí)到了很多東西,只有自己動(dòng)手了才發(fā)現(xiàn)原來自己也沒那么差,之前是真沒想到自己能做出東西來,也很感謝容容老師的教導(dǎo)和鼓勵(lì)。最后希望這篇文章能對各位有所幫助,完整的工程文件和打包工具我會(huì)后面補(bǔ)上。
工程文件(包含源碼和桌面助手應(yīng)用程序文件):
https://download.csdn.net/download/qq_51064962/86806762
第三方打包工具Enigma Virtual Box:https://download.csdn.net/download/qq_51064962/86806787
總結(jié)
以上是生活随笔為你收集整理的Qt实现一个简单的应用程序——桌面助手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩客云搭建WordPress环境(lnm
- 下一篇: 学计算机的有趣软件,这六款实用又有趣的电