QT----计算器

github链接:基于qt的计算器

更多内容可以点击这里查看个人博客:个人博客

1 搭建标准界面

按照下图搭设界面

在这里插入图片描述

修改样式让这计算器看起来更像一点,同时对按钮分组进行样式编辑,添加字符串name,为number,其他按键为other。之前的文章里出现过好几次不在赘述

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

修改最大的样式表

*
{
border:none;
background-color: rgb(243, 243, 243);
}
/* */
QPushButton
{
font: bold 12pt '微软雅黑';
}
QPushButton[name = "number"]
{
border-radius:4px;
background-color: rgb(252, 252, 252); 
}
QPushButton[name = "other"]
{
border-radius:4px;
background-color: rgb(246, 246, 246);
}
/*增加鼠标悬浮背景色 */
QPushButton[name = "number"]:hover
{
border:1px solid rgb(193,193,193);
background-color: rgb(221, 223, 221);
}
QPushButton[name = "other"]:hover
{
border:1px solid rgb(193,193,193);
background-color: rgb(221, 223, 221);
}

接着修改文字输入部分,让他们文字全部右对齐,打开readonly,光标就不会闪烁

2、 逻辑编写

2.1 初始化

首先初始化获得所有的按钮,放入组,方便后续操作,在自己写个槽函数用于处理点击的流程

void cell_Standui::initUI()
{
    //1、把所有的按钮放到一个按钮组里边
    QButtonGroup * buttonGroup = new QButtonGroup(this);
    auto btnList = findChildren<QPushButton*>();
    for(auto btn : btnList)
    {
        buttonGroup->addButton(btn);
    }

    //2、关联按钮组的点击信号
    connect(buttonGroup,&QButtonGroup::buttonClicked,this,&cell_Standui::onButtonGroupClicked);
  vec.resize(5);


}

显示数字,记录比较简单,难点在于各种符号的切换,以及过程和最终结果的显示,在一开始输入时需要清除0,按完=号后,在次输入要清空记录;使用容器记录存着的数和操作过程;根号和平方等只有一个运算数,单独写;使用一个prebtn来记录上一个按键,若是一次计算完成则清空

#include "cell_standui.h"
#include "ui_cell_standui.h"

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

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

void cell_Standui::initUI()
{
    //1、把所有的按钮放到一个按钮组里边
    QButtonGroup * buttonGroup = new QButtonGroup(this);
    auto btnList = findChildren<QPushButton*>();
    for(auto btn : btnList)
    {
        buttonGroup->addButton(btn);
    }

    //2、关联按钮组的点击信号
    connect(buttonGroup,&QButtonGroup::buttonClicked,this,&cell_Standui::onButtonGroupClicked);
    vec.resize(5);
}

void cell_Standui::onButtonGroupClicked(QAbstractButton *btn)
{
    //获取按钮的名称
    // qDebug()<<btn->objectName();

    //首先把框里的数赋值
    auto val1 = ui->le_result->text().toFloat();
    QStringList nameList = btn->objectName().split('_');
    QString name = nameList[1];


    if(name >="0" && name <= "9" || name == "point" )
    {
        //把一开始的0清除
        if(name != "point" && ui->le_result->text() == "0")
        {
            ui->le_result->clear();
        }
        //如果点击数字键的时候输入框有数据,而且表达式框只有两个数据,则重置为刚刚输入的
        if(preBtn == "add" || preBtn == "multiplication" ||preBtn == "subtraction" || preBtn == "divide")
        {
            ui->le_result->clear();
        }
        else if(preBtn == "result" || preBtn == "squareroot" || preBtn == "square" || preBtn == "quarter")
        {
            //判断上次的按钮是不是=,如果是那么一次计算就算完成了,清空所有内容
            ui->le_result->clear();
            ui->le_history->clear();
            vec.clear();
            vec.resize(5);
        }
        //输入数字
        ui->le_result->insert(btn->text());
    }
    else if(name == "ce")
    {
        //清空
        ui->le_result->clear();
    }
    else if(name == "c")
    {
        //清空
        ui->le_result->clear();
        ui->le_history->clear();
        vec.clear();
        vec.resize(5);
    }
    else if(name == "del")
    {
        //删除
        //先让光标的位置移动到前一位
        ui->le_result->setCursorPosition(ui->le_result->cursorPosition()-1);
        ui->le_result->del();
    }
    //输入符号
    else if(name == "add")
    {
        if(vec.size() != 2)
        {
            //把左操作数和运算符保存起来
            vec[0] = val1;
            vec[1] = "+";
        }
    }
    else if(name == "subtraction")
    {
        if(vec.size() != 2)
        {
            //把左操作数和运算符保存起来
            vec[0] = val1;
            vec[1] = "-";
        }
    }
    else if(name == "multiplication")
    {
        if(vec.size() != 2)
        {
            //把左操作数和运算符保存起来
            vec[0] = val1;
            vec[1] = "×";
        }
    }
    else if(name == "divide")
    {
        if(vec.size() != 2)
        {
            //把左操作数和运算符保存起来
            vec[0] = val1;
            vec[1] = "÷";
        }
    }
    else if(name == "result")
    {
        vec[2] = val1;
        vec[3] = "=";
        if(vec[1] == "+")
        {
            vec[4] = vec[0].toFloat()+vec[2].toFloat();
        }
        else if(vec[1] == "-")
        {
            vec[4] = vec[0].toFloat()-vec[2].toFloat();
        }
        else if(vec[1] == "×")
        {
            vec[4] = vec[0].toFloat()*vec[2].toFloat();
        }
        else if(vec[1] == "÷")
        {
            vec[4] = vec[0].toFloat()/vec[2].toFloat();
        }
        ui->le_result->clear();
        ui->le_result->setText(vec[4].toString());
    }
    else if(name == "squareroot")
    {

        //把左操作数和运算符保存起来
        vec[0] = "√ ";
        vec[1] = val1;
        vec[2] = "=" ;
        vec[3] = sqrt(val1);
        ui->le_result->clear();
        ui->le_result->setText(vec[3].toString());
    }
    else if(name == "square")
    {

        //把左操作数和运算符保存起来
        vec[0] = val1;
        vec[1] = "²";
        vec[2] = "=" ;
        vec[3] = val1*val1;
        ui->le_result->clear();
        ui->le_result->setText(vec[3].toString());
    }
    else if(name == "quarter")
    {

        //把左操作数和运算符保存起来
        vec[0] = "1/";
        vec[1] = val1;
        vec[2] = "=" ;
        vec[3] = 1/val1;
        ui->le_result->clear();
        ui->le_result->setText(vec[3].toString());
    }
    else if(name == "mod")
    {

        //把左操作数和运算符保存起来
        vec[0] = val1;
        vec[1] = "%";
        vec[2] = "=" ;
        vec[3] = val1/100;
        ui->le_result->clear();
        ui->le_result->setText(vec[3].toString());
    }

    //显示表达式,每次都清空重新显示
    ui->le_history->clear();
    for(auto var : vec)
    {
        ui->le_history->insert(var.toString());
    }

    preBtn = name;
}


头文件

#ifndef CELL_STANDUI_H
#define CELL_STANDUI_H

#include <QMainWindow>
#include <QButtonGroup>>
#include <QDebug>
#include <QVector>
#include <QVariant>

namespace Ui {
class cell_Standui;
}

class cell_Standui : public QMainWindow
{
    Q_OBJECT

public:
    explicit cell_Standui(QWidget *parent = nullptr);
    ~cell_Standui();
    void initUI();

public slots:
    void onButtonGroupClicked(QAbstractButton* btn);

private:
    Ui::cell_Standui *ui;

    QVector<QVariant> vec;

    //记录上一个按钮的名字
    QString preBtn;
};

#endif // CELL_STANDUI_H

成果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

纯真丁一郎博客点击访问:有时间就要学习
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt是一个跨平台的应用程序开发框架,而Python是一种通用的编程语言。它们的结合可以用来开发界面软件,包括计算器应用程序。使用Qt和Python开发计算器应用程序可以充分利用Qt的丰富界面库和Python的简洁易用性。 下面是一种使用Qt和Python开发计算器应用程序的方法: 1. 首先,安装PyQt5库。可以使用pip命令在命令行执行以下命令来安装PyQt5库: ``` pip install PyQt5 ``` 2. 创建一个新的Python脚本文件,并导入所需的模块: ```python from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLineEdit, QPushButton from PyQt5.QtCore import Qt ``` 3. 创建一个继承自QWidget的自定义窗口类,并在其添加UI元素: ```python class Calculator(QWidget): def __init__(self): super().__init__() # 设置窗口标题和大小 self.setWindowTitle("计算器") self.resize(300, 200) # 创建布局管理器 layout = QVBoxLayout() # 创建文本框和按钮 self.line_edit = QLineEdit() layout.addWidget(self.line_edit) buttons = ["1", "2", "3", "+", "4", "5", "6", "-", "7", "8", "9", "*", "0", ".", "=", "/"] for button_text in buttons: button = QPushButton(button_text) button.clicked.connect(self.button_clicked) layout.addWidget(button) # 将布局管理器设置为窗口的主布局 self.setLayout(layout) ``` 4. 实现按钮点击事件的处理方法: ```python def button_clicked(self): button = self.sender() text = button.text() if text == "=": try: result = eval(self.line_edit.text()) self.line_edit.setText(str(result)) except: self.line_edit.setText("Error") else: self.line_edit.setText(self.line_edit.text() + text) ``` 5. 创建一个QApplication实例,并显示自定义窗口: ```python if __name__ == "__main__": app = QApplication([]) calculator = Calculator() calculator.show() app.exec_() ``` 这就是使用Qt和Python开发计算器应用程序的基本步骤。你可以根据自己的需要进一步定制界面和功能。 引用: : 本文目的是为了了解Qt Python结合开发界面软件的技巧,不是为了完成计算器的算法,所以希望读者注重重点。 : 搬山道人登场 吐槽一下,Python的那个xx界面实在是太丑了,仿佛回到XP时代。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值