Qt实现一个简单的应用程序——桌面助手

一、软件功能及涉及知识

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

第三方打包工具Enigma Virtual Box:https://download.csdn.net/download/qq_51064962/86806787

  • 4
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值