6.9-QT模拟计算器

news2025/6/10 16:44:24

源码:

头文件: widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMouseEvent>

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_btn_0_clicked();

    void on_btn_1_clicked();

    void on_btn_2_clicked();

    void on_btn_3_clicked();

    void on_btn_4_clicked();

    void on_btn_5_clicked();

    void on_btn_6_clicked();

    void on_btn_7_clicked();

    void on_btn_8_clicked();

    void on_btn_9_clicked();

    void on_btn_clear_clicked();

    void on_btn_dot_clicked();

    void on_btn_back_clicked();

    void on_btn_add_clicked();

    void on_btn_sub_clicked();

    void on_btn_div_clicked();

    void on_btn_mul_clicked();

    void on_btn_mod_clicked();

    void on_btn_equal_clicked();

    void setText(const QString& str);

    void changeLine(const QChar& c);

private:
    Ui::Widget *ui;
    int flag = 0; //0-聚焦于lineEdit, 1-聚焦于lineEdit_2, 2-计算完毕.需要清空后重新计算
    QChar sign;
};
#endif // WIDGET_H

源文件:widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::setText(const QString& str) {
    if (flag == 0) {
        QString s = ui->lineEdit->text();
        ui->lineEdit->setText(s += str);
    } else if (flag == 1) {
        QString s = ui->lineEdit_2->text();
        ui->lineEdit_2->setText(s += str);
    }
}

void Widget::on_btn_0_clicked()
{
    setText("0");
}


void Widget::on_btn_1_clicked()
{
    setText("1");
}


void Widget::on_btn_2_clicked()
{
    setText("2");
}


void Widget::on_btn_3_clicked()
{
    setText("3");
}


void Widget::on_btn_4_clicked()
{
    setText("4");
}

void Widget::on_btn_5_clicked()
{
    setText("5");
}


void Widget::on_btn_6_clicked()
{
    setText("6");
}


void Widget::on_btn_7_clicked()
{
    setText("7");
}


void Widget::on_btn_8_clicked()
{
    setText("8");
}


void Widget::on_btn_9_clicked()
{
    setText("9");
}


void Widget::on_btn_clear_clicked()
{
    ui->lineEdit->setText("");
    ui->lineEdit_2->setText("");
    ui->lineEdit_3->setText("");
    this->flag = 0;
    this->sign = '\0';
}


void Widget::on_btn_dot_clicked()
{
    QString s;
    if (flag == 0) {
        s = ui->lineEdit->text();
    } else if (flag == 1){
        s = ui->lineEdit_2->text();
    }
    if (s == nullptr || s == " ") {
        s += "0.";
        if (flag == 0) {
            ui->lineEdit->setText(s);
        } else if (flag == 1){
            ui->lineEdit_2->setText(s);
        }
    }
    if (!s.contains(".")) {
        if (flag == 0) {
            ui->lineEdit->setText(s += '.');
        } else if (flag == 1){
            ui->lineEdit_2->setText(s += '.');
        }
    }
}

void Widget::on_btn_back_clicked()
{
    QString s;
    if (flag == 0) {
        s = ui->lineEdit->text();
        ui->lineEdit->setText(s.removeLast());
    } else if (flag == 1){
        s = ui->lineEdit_2->text();
        ui->lineEdit_2->setText(s.removeLast());
    }
}

void Widget::changeLine(const QChar &c)
{
    if (this->sign.isNull() && c == '-') {
        //1.若第一行为空,则第一个数为负数, 否则做为减号运算符
        QString s = ui->lineEdit->text();
        if (s == "") {
            ui->lineEdit->setText(s += c);
        } else {
            this->sign = c;
            this->flag = 1;
        }
    } else if (!this->sign.isNull() && c == '-') {
        //2.若第二行为空,则第二个数是负数,否则不做处理
        QString s = ui->lineEdit_2->text();
        if (s == "") {
            ui->lineEdit_2->setText(s += c);
        }
    } else if (this->sign.isNull()) { //若还没做过运算,且第一行非空,则转到第二行,若为空则不做处理
        QString s = ui->lineEdit->text();
        if (s != "") {
            this->sign = c;
            this->flag = 1;
        }
    }
}

void Widget::on_btn_add_clicked()
{
    changeLine('+');
}


void Widget::on_btn_sub_clicked()
{
    changeLine('-');
}


void Widget::on_btn_div_clicked()
{
    changeLine('/');
}


void Widget::on_btn_mul_clicked()
{
    changeLine('*');
}


void Widget::on_btn_mod_clicked()
{
    changeLine('%');
}


void Widget::on_btn_equal_clicked()
{
    QString s1 = ui->lineEdit->text().trimmed();
    QString s2 = ui->lineEdit_2->text().trimmed();
    double a, b, res;
    if (flag == 1 && s1 != "" && s2 !="") {//1.两行数都正常输入
        a = s1.toDouble();
        b = s2.toDouble();
        switch(sign.unicode()) {
        case '+':
            res = a + b;
            break;
        case '-':
            res = a - b;
            break;
        case '*':
            res = a * b;
            break;
        case '/':
            res = a / b;
            break;
        case '%':
            res = static_cast<int>(a) % static_cast<int>(b);
            break;
        default:
            throw std::runtime_error("未知运算符异常!");
        }
        ui->lineEdit_3->setText(QString::number(res));
        flag = 2;
    } else if (flag == 0 && s1 != "") {//2.只有第一行有输入,则直接取第一行为结果
        res = s1.toDouble();
        ui->lineEdit_3->setText(QString::number(res));
    } else if (flag == 0 && s1 == "") {//3.两行都为空输入0
        ui->lineEdit_3->setText(QString::number(0));
    }
}

测试计算器功能:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2406838.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 原创笔记&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 上一篇&#xff1a;《数据结构第4章 数组和广义表》…

Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程

鸿蒙电脑版操作系统来了&#xff0c;很多小伙伴想体验鸿蒙电脑版操作系统&#xff0c;可惜&#xff0c;鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机&#xff0c;来体验大家心心念念的鸿蒙系统啦&#xff01;注意&#xff1a;虚拟…

基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)

引言 在嵌入式系统中&#xff0c;用户界面的设计往往直接影响到用户体验。本文将以STM32微控制器和OLED显示屏为例&#xff0c;介绍如何实现一个多级菜单系统。该系统支持用户通过按键导航菜单&#xff0c;执行相应操作&#xff0c;并提供平滑的滚动动画效果。 本文设计了一个…

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…

针对药品仓库的效期管理问题,如何利用WMS系统“破局”

案例&#xff1a; 某医药分销企业&#xff0c;主要经营各类药品的批发与零售。由于药品的特殊性&#xff0c;效期管理至关重要&#xff0c;但该企业一直面临效期问题的困扰。在未使用WMS系统之前&#xff0c;其药品入库、存储、出库等环节的效期管理主要依赖人工记录与检查。库…

从零开始了解数据采集(二十八)——制造业数字孪生

近年来&#xff0c;我国的工业领域正经历一场前所未有的数字化变革&#xff0c;从“双碳目标”到工业互联网平台的推广&#xff0c;国家政策和市场需求共同推动了制造业的升级。在这场变革中&#xff0c;数字孪生技术成为备受关注的关键工具&#xff0c;它不仅让企业“看见”设…

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…

密码学基础——SM4算法

博客主页&#xff1a;christine-rr-CSDN博客 ​​​​专栏主页&#xff1a;密码学 &#x1f4cc; 【今日更新】&#x1f4cc; 对称密码算法——SM4 目录 一、国密SM系列算法概述 二、SM4算法 2.1算法背景 2.2算法特点 2.3 基本部件 2.3.1 S盒 2.3.2 非线性变换 ​编辑…

aardio 自动识别验证码输入

技术尝试 上周在发学习日志时有网友提议“在网页上识别验证码”&#xff0c;于是尝试整合图像识别与网页自动化技术&#xff0c;完成了这套模拟登录流程。核心思路是&#xff1a;截图验证码→OCR识别→自动填充表单→提交并验证结果。 代码在这里 import soImage; import we…

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…

Vue3 PC端 UI组件库我更推荐Naive UI

一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用&#xff0c;前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率&#xff0c;还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库&#xff08;Naive UI、Element …

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…