Qt小项目1 计算器

2023-10-29

 头文件:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QGridLayout>
#include <QDebug>
#include <QString>
#include <QStringList>
#include <QFont>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void number_clicked();
    void expr_clicked();
    void point_clicked();
    void chop_clicked();
    void clear_clicked();
    void equal_clicked();

private:
    QLineEdit *le;
    QPushButton *pb[18];
    double num1,num2,num;//结果,左值,右值
    char expr;
};

#endif // WIDGET_H

cpp文件:

#include "widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QFont font ("Times", 30, QFont::Bold);//设置字体
    this->setFont(font);    //应用到全部

    le=new QLineEdit("0");
    le->setAlignment(Qt::AlignRight);//设置行编辑器为右对齐

    QStringList list ={"0","1","2","3","4","5","6","7","8",\
                       "9",".","/","*","-","+","<-","C","="};

    for(int i=0;i<18;i++)
    {
        pb[i]= new QPushButton(list.at((i)));//初始化按钮,at表示取字符串的第几个参数
    }

    pb[17]->setFixedHeight(130);//设置等号按钮的高度
    QFont font1 ("Times", 50, QFont::Bold);//设置字体
    pb[17]->setFont(font1); //应用到等号


    QGridLayout *gbox = new QGridLayout;
    gbox->addWidget(le,0,0,1,5);

    gbox->addWidget(pb[7],1,0,1,1);
    gbox->addWidget(pb[8],1,1,1,1);
    gbox->addWidget(pb[9],1,2,1,1);
    gbox->addWidget(pb[11],1,3,1,1);// /
    gbox->addWidget(pb[15],1,4,1,1);//<-

    gbox->addWidget(pb[4],2,0,1,1);
    gbox->addWidget(pb[5],2,1,1,1);
    gbox->addWidget(pb[6],2,2,1,1);
    gbox->addWidget(pb[12],2,3,1,1);// *
    gbox->addWidget(pb[16],2,4,1,1);//C

    gbox->addWidget(pb[1],3,0,1,1);
    gbox->addWidget(pb[2],3,1,1,1);
    gbox->addWidget(pb[3],3,2,1,1);
    gbox->addWidget(pb[13],3,3,1,1);// -
    gbox->addWidget(pb[17],3,4,2,1);//=

    gbox->addWidget(pb[0],4,0,1,2);
    gbox->addWidget(pb[10],4,2,1,1);//.
    gbox->addWidget(pb[14],4,3,1,1);//+
    setLayout(gbox);

    for(int i=0;i<10;i++)//数子
    {
        connect(pb[i],SIGNAL(clicked(bool)),this,SLOT(number_clicked()));
    }

    for(int i=11;i<15;i++) //运算符
    {
        connect(pb[i],SIGNAL(clicked(bool)),this,SLOT(expr_clicked()));
    }

    connect(pb[10],SIGNAL(clicked(bool)),this,SLOT(point_clicked()));//.
    connect(pb[15],SIGNAL(clicked(bool)),this,SLOT(chop_clicked()));//<-
    connect(pb[16],SIGNAL(clicked(bool)),this,SLOT(clear_clicked()));//C
    connect(pb[17],SIGNAL(clicked(bool)),this,SLOT(equal_clicked()));//=
    num=num1=num2=0;
    expr='#';
}

Widget::~Widget()
{

}

void Widget::number_clicked()
{
    //sender()通过谁产生信号进入的槽函数
    //通过强制类型转换,转换成对应的派生类对象
    QPushButton *pbb = static_cast<QPushButton *> (sender());//谁产生的信号
    //dynamic_cast
    //int n = pdd->text().toInt();//获取按钮上的文字并转换成整数
    QString str1 = pbb->text();
    QString str =le->text();
    if("0"==str)    //避免出现01,这种0开头的数字
    {
        le->setText(str1);
    }
    else
            le->setText(str+str1);
}

void Widget::expr_clicked()
{
    if('#'!=expr)//避免连续点击多次运算符
        return;
    QPushButton *pbb = static_cast<QPushButton *> (sender());
    QString str = pbb->text();
    expr=str.at(0).toLatin1();//把字符串去第一个字符Qchar,再转换成char类型
    num1=le->text().toDouble();//保存左值
    le->setText("0");   //此时可以输入第二个数字

}

void Widget::point_clicked()
{
    QString str=le->text();
    if(-1!=str.indexOf('.'))//查找字符的位置,找不到返回-1
           return ;
    le->setText(str+'.');//如果没有. ,加上点在运行
}

void Widget::chop_clicked()//删除一个
{
    QString str=le->text();
    if(1==str.length()) //只有一个数字时,删除完要显示0
        le->setText("0");
    else
    {
        str.chop(1);//去掉字符串最后一个元素
        le->setText(str);
    }
}

void Widget::clear_clicked()
{
    expr='#';
    num=num1=num2=0;
    le->setText("0");
}

void Widget::equal_clicked()
{
    if('#'==expr)//避免连续点击
        return;
    num2 = le->text().toDouble();
    switch(expr)
    {
        case '+':
            num=num1+num2;
            break;
        case '-':
            num=num1-num2;
            break;
        case '*':
            num=num1*num2;
            break;
        case '/':
            if(0==num2)
            {
               clear_clicked();
               return;
            }
            num=num1/num2;
            break;
    }
    le->setText(QString::number(num));
    expr='#';
    num=num1=num2=0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt小项目1 计算器 的相关文章

随机推荐

  • java 单一登录

    对于一个帐号在同一时间只能一个人登录 可以通过下面的方法实现 1 在用户登录时 把用户添加到一个ArrayList中 2 再次登录时查看ArrayList中有没有该用户 如果ArrayList中已经存在该用户 则阻止其登录 3 当用户退出时
  • 【笔记】三剑客之awk、sed后向引用

    sed后向引用 语法格式 sed r s 1 g file 1 表示获取第一个括号中的内容 sed支持扩展正则需要加r参数 案例1 调用括号中的内容 root ahui echo root sed r s root 1 g root 案例2
  • 计算机组成原理实验三-----系统总线和具有基本输入输出功能的总线接口实验

    总线是计算机中连接各个功能部件的纽带 是计算机各部件之间进行信息传输的公共通路 总线不只是一组简单的信号传输线 它还是一组协议 他有两大特征 分时 同一总线在同一时刻 只能有一个部件占领总线发送信息 其他部件要发送信息得在该 部件发送完释放
  • 【Echarts】echarts渐变色仪表盘

    echarts渐变色仪表盘 echarts随意一个示例代码 直接点击上方链接 将此段代码放到echarts的示例代码编辑框里 let dataList9 total 85 list name 待处置 value 1501 name 处置中
  • 目标检测发展与综述

    目标检测发展与综述 绪论 在github上的git主hoya012整理了关于目标检测的相关论文 点击此处可获取原文链接GitHub hoya012 deep learning object detection A paper list of
  • curl -u 背后的内容以及和 Django rest framework 的 BasicAuthentication 的呼应

    curl u 的基本介绍 curl 是常用的命令行工具 用来请求 Web 服务器 它的名字就是客户端 client 的 URL 工具的意思 它的功能非常强大 命令行参数多达几十种 如果熟练的话 完全可以取代 Postman 这一类的图形界面
  • libusb编译、测试、使用

    要用到才开始学 啥都不懂 感觉好难受 最近要在ARM Linux嵌入式端集成libusb 刚开始搞 慢慢写 首先是libusb的交叉编译和测试 交叉编译 下载libusb的源码 下载地址 https sourceforge net proj
  • upload-labs1-5

    用浏览器打开upload 第一关 js检查 上传文件会获得提示 把文件后缀改为 jpg png gif 我这里用的是jpg 打开burpsuite在upload上传修改后的文件进行爪包 在burpsuite中修改文件进行回显 第二关 仅判断
  • Java学习笔记(十九)

    Spring Cloud 什么是Spring Cloud Spring cloud 应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序 提供与外部系统的集成 更专注于服务治理 Spring cloud Task 一
  • eix安装_U盘安装原版Windows7

    教程简介 本教程为U盘安装原版Windows 7 我将带领大家学习如何用U盘安装原版的Windows7系统 希望对大家有帮助 在开始安装之前需要了解常见电脑的U盘启动按键都有哪些 请仔细阅读下表 安装步骤 一定要看步骤3 不然造成数据损坏概
  • 爬虫入门第2课:代理池的设计

    爬虫学习知识点及案例篇 汇总 爬虫入门第1课 代理池概述及开发环境 本阶段带大家从代理池的设计开始 学习Python爬虫及项目实战 详情关注上方专栏 1 代理池的工作流程 目标 理解代理池的工作流程 以及 各个模块的作用 内容介绍 代理池的
  • Java-API简析_java.net.InetAddress类(基于 Latest JDK)(浅析源码)

    版权声明 未经博主同意 谢绝转载 请尊重原创 博主保留追究权 https blog csdn net m0 69908381 article details 131590559 出自 进步 于辰的博客 因为我发现目前 我对Java API的
  • 模板引擎 template

    1 特性 性能卓越 执行速度通常是Mustache与tmpl的20多倍 性能测试 支持运行时调试 可精确定位异常模板所在的语句 对NodeJS Express友好支持 安全 默认对输出进行转义 在沙箱中运行编译后的代码 Node版本可以安全
  • SQL Server批处理运行时错误的影响

    前言 批处理是同时从应用程序发送到 SQL Server 2005 并得以执行的一组单条或多条 Transact SQL 语句 我们通常认为当一个批处理的多条语句中有一条发生运行时错误 将停止执行批处理中当前语句和它之后的语句 这使得在实际
  • Seq2Seq实战——机器翻译

    基于seq2seq做一个机器翻译 我们将使用PyTorch和TorchText构建一个机器学习模型 从一个序列到另一个序列 将德语到英语翻译成英语 该模型是 Sequence to Sequence Learning with Neural
  • 简单html文件上传带参数

    html的代码如下
  • 2021SC@SDUSC Zxing开源代码(十六)PDF417二维码(二)

    2021SC SDUSC 目录 一 BarcodeMatrix 二 BarcodeRow 三 Compaction 四 Dimensions 五 PDF417ErrorCorrection 六 PDF417HighLevelEncoder
  • [创业之路-57] :商业计划书BP如何书写?总体框架!

    引言 BP Buiness Plan 即商业计划书 本质上还是一份计划 是一份商业计划 即一种关于如何赚钱的计划 是一份通过组建公司 运营项目 进而赚钱的项目计划 什么是商业 商业 是一种有组织的提供顾客所需的物品与服务 都可以称为产品 的
  • 逻辑运算符&&、&、

    运算符 和 以及 和 的区别 逻辑运算符 与 只要有一边为fale 那么就是false 或 只要有一边为true 那么就是true 异或 只要是相同的boolean值 那么就是false 不相同才是true 逻辑运算符 双与 双或 解释 双
  • Qt小项目1 计算器

    头文件 ifndef WIDGET H define WIDGET H include