一、軟件功能及涉及知識(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)槲覀冊(cè)诓煌慕缑嫔戏謩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ì)算器功能。
然后就在對(duì)應(yīng)的文件里去添加需要的控件并對(duì)界面進(jìn)行合適的布局(這樣到時(shí)候控件就能隨著窗口的大小而變化),我的布局如下。
日歷界面:
?計(jì)時(shí)器界面:
計(jì)算器界面:
?需要注意每個(gè)控件對(duì)象的名稱要記住不能搞混,可以在右下角的屬性面板對(duì)應(yīng)的objectName里查看或修改,但控件要顯示的名字或內(nèi)容可以直接點(diǎn)擊控件編輯。
3、準(zhǔn)備好這一切我們就開始編寫程序
第一步、先實(shí)現(xiàn)實(shí)現(xiàn)三個(gè)界面之間可以相互切換
在上一步添加按鈕的時(shí)候,可以直接右鍵點(diǎn)擊對(duì)應(yīng)的按鈕,然后點(diǎn)擊轉(zhuǎn)到槽,因?yàn)橐獙?shí)現(xiàn)點(diǎn)擊按鈕的時(shí)候發(fā)現(xiàn)對(duì)應(yīng)的反應(yīng),所以下一步選擇clicked(),最后點(diǎn)擊ok就會(huì)在.cpp文件中生成對(duì)應(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(日歷)界面
}
不要忘了需要在對(duì)應(yīng)的文件里添加需要切換界面對(duì)應(yīng)的頭文件。
第二步、每個(gè)窗口對(duì)應(yīng)的功能
日歷界面的功能比較簡(jiǎn)單,只是顯示日歷,只需要在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);//每次增加1
ui->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è)按鈕對(duì)應(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("請(qǐng)輸入:");//開始時(shí)輸入框中顯示“請(qǐng)輸入:”
//初始化定義好的變量
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)容上加上對(duì)應(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("請(qǐng)輸入:");
dot = 0;
}
void MainWindow3::on_pushButton_exit_clicked()//退出
{
close();//直接關(guān)閉當(dāng)前界面
}
第三步、對(duì)每個(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)鏈接庫(kù)封裝在一起。步驟:
(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ì)。最后希望這篇文章能對(duì)各位有所幫助,完整的工程文件和打包工具我會(huì)后面補(bǔ)上。
工程文件(包含源碼和桌面助手應(yīng)用程序文件):
https://download.csdn.net/download/qq_51064962/86806762文章來源:http://www.zghlxwxcb.cn/news/detail-474106.html
第三方打包工具Enigma Virtual Box:https://download.csdn.net/download/qq_51064962/86806787文章來源地址http://www.zghlxwxcb.cn/news/detail-474106.html
到了這里,關(guān)于Qt實(shí)現(xiàn)一個(gè)簡(jiǎn)單的應(yīng)用程序——桌面助手的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!