实现简易计算器 网格布局 QT环境 纯代码C++实现

news2024/11/20 11:54:48

问题:通过代码完成一个10以内加减法计算器。不需要自适应,界面固定360*350

"="按钮90*140,其它按钮90*70

参考样式

#define DEFULT_BUTTON_STYLE "\
QPushButton{\
    color:#000000;\
    border:1px solid #AAAAAA;\
    border-radius:0;\
    background-color:#FFFFFF;\
}\
QPushButton:pressed{\
    color:#FFFFFF;\
    background-color:#AAAAAA;\
}\
"

代码:

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtWidgets>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::Widget *ui;
    int num1; // 操作数1
    int num2; // 操作数2
    QString m_operator; // 运算符
    QString current_input1; // 操作数1
    QString current_input2; // 操作数2
    int result; // 结果
    int flag; // 是否已经输入运算符
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#define DEFULT_BUTTON_STYLE "\
QPushButton{\
    color:#000000;\
    border:1px solid #AAAAAA;\
    border-radius:0;\
    background-color:#FFFFFF;\
}\
QPushButton:pressed{\
    color:#FFFFFF;\
    background-color:#AAAAAA;\
}\
"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle("计算器");
    current_input1.clear(); // 清空字符串
    current_input2.clear();
    flag = 0; // flag置0

    QLabel *label = new QLabel; // 结果输出框label
    label->setAlignment(Qt::AlignRight|Qt::AlignHCenter|Qt::AlignVCenter); // 靠右居中对齐
    label->setText("0");
    label->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);

    QPushButton *button[10];
    for(int i = 0;i < 10;i++){
        button[i] = new QPushButton;
        button[i]->setText(QString::number(i));
        button[i]->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
        button[i]->setStyleSheet("DEFULT_BUTTON_STYLE");
        connect(button[i],&QPushButton::clicked,this,[=](){
            if(flag ==0){
                current_input1 += QString::number(i); // 数字转换成字符串拼接
                label->setText(current_input1); // 显示到label上
            }
            else{
                current_input2 += QString::number(i); // 数字转换成字符串拼接
                QString temp = current_input1 + m_operator + current_input2; // 字符串拼接
                label->setText(temp); // 显示
            }
        });
    }
    QPushButton *add_button = new QPushButton;
    add_button->setText("+");
    add_button->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
    connect(add_button,&QPushButton::clicked,this,[=](){
        m_operator = "+";
        flag = 1;
        QString temp = current_input1 + m_operator; // 字符串拼接
        label->setText(temp); // 显示
    });
    QPushButton *sub_button = new QPushButton;
    sub_button->setText("-");
    sub_button->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
    connect(sub_button,&QPushButton::clicked,this,[=](){
        m_operator = "-";
        flag = 1;
        QString temp = current_input1 + m_operator;
        label->setText(temp); // 显示
    });
    QPushButton *equal_button = new QPushButton;
    equal_button->setText("=");
    equal_button->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
    connect(equal_button,&QPushButton::clicked,this,[=](){
        num1 = current_input1.toInt();
        num2 = current_input2.toInt();

        if(m_operator == "+")
            result = num1 + num2;
        else if(m_operator == "-")
            result = num1 - num2;

        QString temp = QString("%1 %2 %3 = %4").arg(num1).arg(m_operator).arg(num2).arg(result);
        label->setText(temp); // 显示

        current_input1.clear();
        current_input2.clear();
        num1 = 0;
        num2 = 0;
        flag = 0;
    });

    QPushButton *clear_button = new QPushButton;
    clear_button->setText("C");
    clear_button->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
    connect(clear_button,&QPushButton::clicked,this,[=](){
        current_input1.clear(); // 清空
        current_input2.clear();
        num1 = 0;
        num2 = 0;
        flag = 0;
        label->setText("0"); // 显示到label上
    });

    QPushButton *del_button = new QPushButton;
    del_button->setText("DEL");
    del_button->setSizePolicy(QSizePolicy::Preferred,QSizePolicy::Preferred);
    connect(del_button,&QPushButton::clicked,this,[=](){
        if(flag == 0){ // flag==0 说明目前处于第一个操作数
            current_input1.chop(1); // 去除尾端数字
            label->setText(current_input1);
        }
        else if(flag == 1 && current_input2.isEmpty()){ // 说明目前已经输入完运算符但还没有输入第二个操作数
            m_operator =""; // 设置为空
            flag = 0;
            label->setText(current_input1); // 显示
        }
        else{ // 说明目前处于第二个操作数
            current_input2.chop(1); // 去除尾端数字
            QString temp = current_input1 + m_operator + current_input2;
            label->setText(temp); // 显示
        }
    });


    QGridLayout *layout = new QGridLayout(this); // 网格布局
    layout->addWidget(label,0,0,1,4);
    layout->addWidget(clear_button,1,0,1,1);
    layout->addWidget(del_button,1,1,1,1);
    layout->addWidget(add_button,1,2,1,1);
    layout->addWidget(sub_button,1,3,1,1);
    layout->addWidget(button[7],2,0,1,1);
    layout->addWidget(button[8],2,1,1,1);
    layout->addWidget(button[9],2,2,1,1);
    layout->addWidget(button[0],2,3,1,1);
    layout->addWidget(button[4],3,0,1,1);
    layout->addWidget(button[5],3,1,1,1);
    layout->addWidget(button[6],3,2,1,1);
    layout->addWidget(button[1],4,0,1,1);
    layout->addWidget(button[2],4,1,1,1);
    layout->addWidget(button[3],4,2,1,1);
    layout->addWidget(equal_button,3,3,2,1);

    layout->setMargin(0); // 边界
    layout->setSpacing(0); // 各部件之间间距
}

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

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

输出:

初始化界面:

示例:

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

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

相关文章

RNN公式解释:实现记忆功能;RNN的状态向量

目录 RNN公式解释:实现记忆功能 一、词向量 二、RNN的状态向量 三、词向量变为状态向量的过程 四、总结 RNN公式解释:实现记忆功能 在RNN(递归神经网络)中,词向量变为状态向量的过程,实际上是RNN处理时序数据的一个核心环节。以下是对这一过程的详细解释: 一、词向…

【Linux】基础02

Linux编译和调试 VI编辑文件 vi : 进入文件编辑 是命令行模式 i &#xff1a;从光标处进入插入模式 dd : 删除光标所在行 n dd 删除指定行数 Esc &#xff1a; 退出插入模式 &#xff1a; 冒号进入末行模式 :wq : 保存退出 :q &#xff1a; 未修改文件可以退出 :q! …

21.UE5游戏存档,读档,函数库

2-23 游戏存档、读档、函数库_哔哩哔哩_bilibili 目录 1.存档蓝图 2.函数库 2.1保存存档 2.2读取存档&#xff1a; 3.加载游戏&#xff0c;保存游戏 3.1游戏实例对象 3.2 加载游戏 3.3保存游戏 这一节的内容较为错综复杂&#xff0c;中间没有运行程序进行阶段性成果的验…

未来已来:少儿编程竞赛聚焦物联网,激发创新潜力

随着人工智能与物联网技术&#xff08;IoT&#xff09;的快速发展&#xff0c;少儿编程教育正在迎来新的变革浪潮。近年来&#xff0c;各类少儿编程竞赛纷纷增加了物联网相关主题&#xff0c;要求学生结合编程知识和硬件设备设计智能家居、智慧城市等创新项目。这一趋势不仅丰富…

布局设计器

介绍 最近遇到一个设计器的需求&#xff0c;要求拖拽布局&#xff0c;图层管理&#xff0c;自定义组件预览&#xff0c;分辨率等等功能。说白了就是先用设计器布局然后在屏幕上播放你布局好的内容 所以不多说了直接上代码 代码地址 这里大概说下有哪些功能吧 图层与属性框的值关…

Java中日志采集框架-JUL、Slf4j、Log4j、Logstash

1. 日志采集 日志采集是指在软件系统、网络设备、服务器或其他IT基础设施中自动收集日志文件和事件信息的过程。这些日志通常包含了时间戳、事件类型、源和目标信息、错误代码、用户操作记录等关键数据。日志采集的目的是为了监控系统运行状态、分析系统性能、审计用户行为、故…

ansible从入门到精通(完整篇)

ansible从入门到精通&#xff08;完整篇&#xff09; 转自ansible从入门到精通&#xff08;完整篇&#xff09; 文章目录 01 Ansible介绍与安装 1. 介绍 Ansible 1.1 什么是 Ansible?1.2 Ansible 无需代理1.3 Ansible 方式 2. 安装 Ansible 2.1 控制节点2.2 受管主机2.3…

Python自学之Colormaps指南

目录 1.色彩映射表&#xff08;Colormaps&#xff09;是什么&#xff1f; 2.Matplotlib中的色彩映射表类型 2.1同色渐变&#xff08;Sequential Colormaps&#xff09; 2.2双色渐变&#xff08;Divergence Colormaps&#xff09; 2.3定性色彩&#xff08;Qualitative Col…

CentOS 环境下通过 YUM 安装软件

操作场景 为提升用户在云服务器上的软件安装效率&#xff0c;减少下载和安装软件的成本&#xff0c;腾讯云提供了 YUM 下载源。在 CentOS 环境下&#xff0c;用户可通过 yum 命令快速安装软件。对于 YUM 下载源&#xff0c;用户不需要添加软件源&#xff0c;可以直接安装软件包…

手机远程控制电脑,让办公更快捷

在数字化办公的浪潮下&#xff0c;远程控制软件已成为连接工作与生活的桥梁。它使得用户能够通过一台设备&#xff08;主控端&#xff09;来操作另一台设备&#xff08;被控端&#xff09;&#xff0c;无论它们是否位于同一局域网内。这种软件广泛应用于远程办公、手机远程控制…

WebRTC实现双端音视频聊天(Vue3 + SpringBoot)

目录 概述 相关概念 双端连接整体实现步骤概述 文章代码实现注意点 STUN和TURN服务器的搭建 开发过程描述 后端开发流程 前端开发流程 效果演示 Gitee源码地址 概述 文章描述使用WebRTC技术实现一对一音视频通话。 由于设备摄像头限制&#xff08;一台电脑作测试无法…

[C++]:C++11(二)

1. 左值与右值 1.1 左值与右值的概念 左值&#xff1a;左值本质上是一个表示数据的表达式&#xff0c;常见的如变量名或者解引用后的指针等形式。它具备以下显著特点&#xff1a; 可被取地址&#xff1a;能够通过取地址操作符 & 获取其内存地址&#xff0c;这意味着它在内…

Acme PHP - Let‘s Encrypt

Lets Encrypt是一个于2015年三季度推出的数字证书认证机构&#xff0c;旨在以自动化流程消除手动创建和安装证书的复杂流程&#xff0c;并推广使万维网服务器的加密连接无所不在&#xff0c;为安全网站提供免费的SSL/TLS证书。 使用PHP来更新证书&#xff1a; Acme PHP | Rob…

探索 HTML 和 CSS 实现的 3D旋转相册

效果演示 这段HTML与CSS代码创建了一个包含10张卡片的3D旋转效果&#xff0c;每张卡片都有自己的边框颜色和图片。通过CSS的3D变换和动画&#xff0c;实现了一个动态的旋转展示效果 HTML <div class"wrapper"><div class"inner" style"-…

Cargo Rust 的包管理器

Cargo->Rust 的包管理器 Cargi简介Cargo 的主要功能1. 创建项目2. 管理依赖3. 构建项目4. 运行项目5. 测试代码6. 检查代码7. 生成文档8. 发布和分享包 Cargo 的核心文件1. Cargo.toml2. Cargo.lock **Cargo 的生态系统** 常用命令总结Hello, Cargo! 示例 Cargi简介 Cargo …

代码随想录算法训练营第三十五天| 01背包问题 二维 、01背包问题 一维、416. 分割等和子集 。c++转java

背包理论基础 视频地址&#xff1a; 带你学透0-1背包问题&#xff01;| 关于背包问题&#xff0c;你不清楚的地方&#xff0c;这里都讲了&#xff01;| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili 01背包问题 二维 题目我是在Acwing上面做的&#xff0c;思路可以…

亚马逊云科技宣布新推出Elasticahe for Redis的 Valkey缓存

Amazon ElastiCache 宣布支持 Valkey&#xff0c;与其他支持的引擎相比&#xff0c;无服务器的价格低 33%&#xff0c;基于节点的价格低 20%。使用 ElastiCache Serverless for Valkey&#xff0c;客户可以在一分钟内创建缓存&#xff0c;并且起步价低至每月 6 USD。Valkey 是由…

SpringBoot3.x.x整合Ehcache3 实例(入门踩坑教程)

近期尝试了一下 SpringBoot 3.3.5 JDK17 Ehcache3.10.8整合 注意&#xff0c;这个版本的boot&#xff0c;提出了公用的缓存模板&#xff0c;Spring官网有相关介绍&#xff0c;整合ehcache需要使用jcache。 老版本的3.0版本以下整合&#xff0c;我这里就不参与了&#xff0c;可以…

跨平台WPF框架Avalonia教程 十六

SelectableTextBlock 可选文本块 SelectableTextBlock 块是一个用于显示文本的标签&#xff0c;允许选择和复制文本。它可以显示多行&#xff0c;并且可以完全控制所使用的字体。 有用的属性​ 您可能最常使用这些属性&#xff1a; 属性描述SelectionStart当前选择的起始字…

每日一练:【优先算法】双指针之移动零(easy)

双指针概念介绍 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是左右指针。 对撞指针&#xff1a;一般用于顺序结构中&#xff0c;也称左右指针。 • 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最右端开始&#xff0c;然后逐渐…