一、软件功能及涉及知识
1、实现不同功能之间的界面切换
2、可查看日历
3、可实现计时器功能
4、可实现计算器功能
5、ui界面及按钮部件背景的设置
6、为软件设置图标
7、程序打包成软件
二、效果演示
三、实现过程
1、创建工程
New Project -> Application -> Qt Widgets Application然后下一步,使用ui界面文件能省去很多步骤。
点击下一步、完成就创建好了一个包含.h、.cpp、.ui文件的工程。
因为我们在不同的界面上分别实现查看日历、计时器、计算器的功能,所以还需要在工程里创建两个.h、.cpp、.ui文件,过程如下。
直接下一步、完成就创建成功,在以同样的方式添加一个类名为MainWindow3的文件,结果如下。
2、工程创建成功,开始实现功能
首先要确定好在哪个文件里实现什么功能,我这里是在MainWindow里实现查看日历功能,在MainWindow2里面实现计时器功能,在MainWindow3里面实现计算器功能。
然后就在对应的文件里去添加需要的控件并对界面进行合适的布局(这样到时候控件就能随着窗口的大小而变化),我的布局如下。
日历界面:
计时器界面:
计算器界面:
需要注意每个控件对象的名称要记住不能搞混,可以在右下角的属性面板对应的objectName里查看或修改,但控件要显示的名字或内容可以直接点击控件编辑。
3、准备好这一切我们就开始编写程序
第一步、先实现实现三个界面之间可以相互切换
在上一步添加按钮的时候,可以直接右键点击对应的按钮,然后点击转到槽,因为要实现点击按钮的时候发现对应的反应,所以下一步选择clicked(),最后点击ok就会在.cpp文件中生成对应按钮的槽函数,还会在.h头文件里自动申明,我们只需要在槽函数里添加要实现的功能的代码就可以了,代码如下。
mainwindow.cpp
void MainWindow::on_pushButton_clicked()//计时器按钮生成的槽函数
{
MainWindow2 *mainwindow2=new MainWindow2;//为 MainWindow2 窗口创建一个名字,方便操作它
this->close();//点击计时器按钮时关闭当前界面
mainwindow2->show();//打开窗口 mainwindow2(计时器)界面
}
void MainWindow::on_pushButton_4_clicked()//计算器按钮的槽函数
{
MainWindow3 *mainwindow3=new MainWindow3;
this->close();//点击计算器按钮时关闭当前界面
mainwindow3->show();//打开窗口 mainwindow3(计算器)界面
}
mainwindow2.cpp
void MainWindow2::on_pushButton_clicked()//日历按钮生成的槽函数
{
MainWindow *mainwindow=new MainWindow;
this->close();//点击日历按钮后关闭当前界面
mainwindow->show();//进入mainwindow(日历)界面
}
void MainWindow2::on_pushButton_2_clicked()//计算器按钮的槽函数
{
MainWindow3 *mainwindow3=new MainWindow3;
this->close();//点击计算器按钮后关闭当前界面
mainwindow3->show();//进入mainwindow3(计算器)界面
}
}
mainwindow3.cpp
void MainWindow3::on_pushButton_clicked()//日历按钮的槽函数
{
MainWindow2 *mainwindow2=new MainWindow2;
this->close();//点击计时器按钮时关闭当前界面
mainwindow2->show();//打开mainwindow2(计时器)界面
}
void MainWindow3::on_pushButton_3_clicked()//计时器按钮生成的槽函数
{
MainWindow *mainwindow=new MainWindow;
this->close();//点击日历按钮时关闭当前界面
mainwindow->show();//打开mainwindow(日历)界面
}
不要忘了需要在对应的文件里添加需要切换界面对应的头文件。
第二步、每个窗口对应的功能
日历界面的功能比较简单,只是显示日历,只需要在ui文件中添加一个Calendar Widget部件就可以了。
计时器界面需要使用到QTimer类,需要添加代码如下。
mainwindow2.h
#include <QTime>
#include <QTimer>
QTime *time;
QTimer *timer;
mainwindow2.cpp
time = new QTime;
timer = new QTimer;//创建一个定时器
ui->Timer->setDigitCount(8);//数码管需要显示8个
initTime();
connect(timer,SIGNAL(timeout()),this,SLOT(updateTime()));//信号与槽
connect(ui->pbStart,SIGNAL(clicked()),this,SLOT(pbStart_clicked()));//信号与槽
void MainWindow2::initTime()//
{
time->setHMS(0,0,0);//设置初值
ui->Timer->display(time->toString("hh:mm:ss"));
}
void MainWindow2::updateTime()//开始计时
{
*time=time->addSecs(1);//每次增加1
ui->Timer->display(time->toString("hh:mm:ss"));
}
void MainWindow2::pbStart_clicked()//start按钮生成的槽函数
{
if(QString::compare(ui->pbStart->text(),"stop"))
{
initTime();//每次开始前初始化
timer->start(1000);//每次增加时间为一秒
ui->pbStart->setText("stop");
}
else
{
timer->stop();
ui->pbStart->setText("start");
//initTime();
}
}
计算器界面,按键比较多,设置按键类名的时候尽量设计的与它的功能相近,不然写功能的时候可能会写乱,然后按钮转到槽,再编写每个按钮对应的功能,由于该部分代码比较多部分代,这里先展示一部分,完整代码后面打包发出。
mainwindow3.h
//在私有成员变量里定义号需要用到的变量
QString process;
float result;
QString S;
QString Sresult;
float sum;
int choose;
int stat;
int dot;
mainwindow3.cpp
ui->textEdit_show->setText("请输入:");//开始时输入框中显示“请输入:”
//初始化定义好的变量
process="";
result = 0;
S = "";
stat = 0;
choose = 0;
sum = 0;
dot = 0;
void MainWindow3::on_pushButton_zero_clicked()//按钮0生成的槽函数,点击0时在原来的内容上加上数字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);
}
}
数字按钮1~9的功能代码相似,都是在原来的内容上加上对应的数字。
void MainWindow3::on_pushButton_sum_clicked()//实现加法
{
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()//小数点
{
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;//如果刚按了等号又按数字,相当于做一次AC,如果按了等号再按加号,就继续计算
choose = 0;//告诉程序类重新接受运算符
S = "";
process = "";
//因为要连续计算,所以不将过程值清零
}
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();//直接关闭当前界面
}
第三步、对每个窗口和控件进行美化
给每个界面设置一个背景图片,首先和添加ui/h文件的方式相似,鼠标右击工程,添加新文件,后面步骤如下。
接着下一步、完成,然后右击刚才生成的文件 -> 添加现有文件 -> 自动打开文件之后,在里面新建一个文件,选择它打开并在里面放如我们想用的背景图片点击打开后选择Yes to All。
目录上就有了刚刚选择的图片。
有了图片就可以到ui文件去进行设置,右击界面的空白处 -> 改变样式表 -> 下拉添加资源选择background-image -> Picture->选择图片 -> OK。
添加#MainWindow2表示设置为该界面主窗口的背景。
然后还可以设置一下按钮的背景或颜色,做法和设置界面背景一样但设置颜色的话就下拉添加颜色。
第四步、为软件添加一个图标,使他看起来更像一个应用程序。
注意图标必须是以ioc为后缀的图片,操作方式如下。
在工程目录里添加我们想要的图标。
在.pro文件中进行以下操作。
到这里,程序就完成的差不多了。
四、将程序打包成软件
1、把工程编译模式从debug调到release模式下,然后编译。
2、找到工程存放位置下,有一个release的文件夹,子文件下有个release的文件,其中就会生成一个后缀为exe的可执行文件。
3、进行封包操作,将运行程序和它需要的动态链接库封装在一起。步骤:
(1)、在英文路径下创建一个文件夹aaa(文件夹名称也要是英文的),然后找到刚才编译生成的exe文件,并将它拷贝到新创建的文件aaa下。(如果你双击执行这个程序,你会发现系统提示没有缺少的dll文件)
(2)、利用QT的windeployqt工具导入程序所需要的文件和资源。(这个程序可以直接在电脑右下角搜索qt,选择有一个黑色面板的那个)
在这之前需要先复制一份刚刚新建的文件夹aaa的录进。
然后先进入文件所在的系统盘,我是放在桌面的就去c盘,c:加上回车键就可以了。
然后粘贴上刚才复制的文件路径回车。
在路径后面加上“windeployqt 程序名.exe”,回车进行封包操作
3、打包完成后,就和我们平时看到的软件一样了,可以在文件夹下直接打开那个文件了。
4、如果觉得文件太多,我们可以使用第三方工具将所有文件打包成一个,我这里使用的是Enigma Virtual Box。
先找到文件并打开。
下一步。
选择装整个程序的文件夹并确认。
点击Files Ootions后勾上Compress Files可以将文件压缩小一点。
最后点击Process开始打包成一个文件。
最后直接关闭,我们就可以在原来程序的文件里看到一个大概20兆的应用程序,就是刚才打包好的一个完整的应用程序(我这里将它重命名了桌面助手),可以直接放在桌面上打开。
五、总结
到这里这个应用程序就算是彻底完成了,通过这个项目也让我学习到了很多东西,只有自己动手了才发现原来自己也没那么差,之前是真没想到自己能做出东西来,也很感谢容容老师的教导和鼓励。最后希望这篇文章能对各位有所帮助,完整的工程文件和打包工具我会后面补上。
工程文件(包含源码和桌面助手应用程序文件):
https://download.csdn.net/download/qq_51064962/86806762文章来源:https://www.toymoban.com/news/detail-474106.html
第三方打包工具Enigma Virtual Box:https://download.csdn.net/download/qq_51064962/86806787文章来源地址https://www.toymoban.com/news/detail-474106.html
到了这里,关于Qt实现一个简单的应用程序——桌面助手的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!