基于Qt/C++的计算器设计与实现

 calculator1_5.pro

QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++17

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    mywidget.cpp \
    scientific.cpp

HEADERS += \
    mywidget.h \
    scientific.h

FORMS += \
    mywidget.ui \
    scientific.ui

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

RESOURCES += \
    icons.qrc

 mywidget.h

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class MyWidget; }
QT_END_NAMESPACE

class MyWidget : public QWidget
{
    Q_OBJECT

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

private:
    Ui::MyWidget *ui;
private slots:
    void NumPressed();
    void MathButtonPressed();
    void EqualButton();
    void on_Point_clicked();
    void on_ChangeSign_clicked();
    void on_reciprocal_clicked();
    void on_percent_clicked();
    void on_AllClear_clicked();
    void on_Clear_clicked();
    void on_MemAdd_clicked();
    void on_MemClear_clicked();
    void on_scientific_clicked();
};
#endif // MYWIDGET_H

 scientific.h

#ifndef SCIENTIFIC_H
#define SCIENTIFIC_H
#include <QWidget>

namespace Ui {
class scientific;
}
class scientific : public QWidget
{
    Q_OBJECT
public:
    explicit scientific(QWidget *parent = nullptr);
    ~scientific();

private slots:
    void on_standard_clicked();
    void NumPressed();
    void MathButtonPressed();
    void EqualButton();
    void on_Point_clicked();
    void on_ChangeSign_clicked();
    void on_reciprocal_clicked();
    void on_AllClear_clicked();
    void on_Clear_clicked();
    void on_sin_clicked();
    void on_cos_clicked();
    void on_tan_clicked();
    void on_pai_clicked();
    void on_square_clicked();
    void on_sqrt_clicked();
    void on_exp_clicked();
    void on_factorial_clicked();
    void on_log_clicked();
    void on_exponent_clicked();
    void on_ln_clicked();
    void on_abs_clicked();
    void on_tenN_clicked();
    void on_XN_clicked();
private:
    Ui::scientific *ui;
};

#endif // SCIENTIFIC_H

main.cpp

#include "mywidget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MyWidget w;
    w.show();
    return a.exec();
}

mywidget.cpp

#include "mywidget.h"
#include "ui_mywidget.h"
#include "scientific.h"
#include "QRegularExpression"
#include "QMessageBox"
#include <cstring>
double calcVal = 0.0;
bool divTrigger = false;
bool multTrigger = false;
bool addTrigger = false;
bool subTrigger = false;

MyWidget::MyWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    ui->Display->setText(QString::number(calcVal));
    QPushButton *numButtons[10];
    for(int i=0;i<10;i++){
        QString buttonName = "Button" + QString::number((i));
        numButtons[i] = MyWidget::findChild<QPushButton *>(buttonName);
        connect(numButtons[i],SIGNAL(released()),this,SLOT(NumPressed()));
    }
    connect(ui->Add,SIGNAL(released()),this,SLOT(MathButtonPressed()));
    connect(ui->Subtract,SIGNAL(released()),this,SLOT(MathButtonPressed()));
    connect(ui->Multiply,SIGNAL(released()),this,SLOT(MathButtonPressed()));
    connect(ui->Divide,SIGNAL(released()),this,SLOT(MathButtonPressed()));
    connect(ui->Equals,SIGNAL(released()),this,SLOT(EqualButton()));

}

MyWidget::~MyWidget()
{
    delete ui;
}
void MyWidget::NumPressed()
{
    QPushButton *button = (QPushButton *)sender();
    QString butval = button->text();
    QString displayVal = ui->Display->text();
    if((displayVal.toDouble() == 0)||(displayVal.toDouble() == 0.0)){
        ui->Display->setText(butval);
    }
    else{
        QString newVal = displayVal+butval;
        double dblNewVal = newVal.toDouble();
        ui->Display->setText(QString::number(dblNewVal,'g',16));
    }
}

void MyWidget::MathButtonPressed()
{
    divTrigger = false;
    multTrigger = false;
    addTrigger = false;
    subTrigger = false;
    QString displayVal = ui->Display->text();
    calcVal = displayVal.toDouble();
    QPushButton *button = (QPushButton *)sender();
    QString butVal = button->text();
    if(QString::compare(butVal,"/",Qt::CaseInsensitive) == 0){
        divTrigger = true;
    }else if(QString::compare(butVal,"*",Qt::CaseInsensitive) == 0){
        multTrigger = true;
    }else if(QString::compare(butVal,"+",Qt::CaseInsensitive) == 0){
        addTrigger = true;
    }else if(QString::compare(butVal,"-",Qt::CaseInsensitive) == 0){
        subTrigger = true;
    }
    ui->Display->setText("");


}
void MyWidget::EqualButton()
{
    double solution = 0.0;
    QString displayVal = ui->Display->text();
    double dblDisplayVal = displayVal.toDouble();
    if(addTrigger || subTrigger || multTrigger || divTrigger){
        if(addTrigger){
            solution = calcVal + dblDisplayVal;
        }else if(subTrigger){
            solution = calcVal - dblDisplayVal;
        }else if(multTrigger){
            solution = calcVal * dblDisplayVal;
        }else if(divTrigger){
            solution = calcVal / dblDisplayVal;
        }
    }
    ui->Display->setText(QString::number(solution));
}
void MyWidget::on_Point_clicked()
{
    if(ui->Display->text()=="")
        ui->Display->setText("0.");
    else if(ui->Display->text().contains(".")==true)
        ; //数字串中已有小数点,不能再输入
    else
        ui->Display->setText(ui->Display->text()+".");
}
void MyWidget::on_ChangeSign_clicked()
{
    QString displayVal = ui->Display->text();
    QRegularExpression reg("-?[0-9]+(?:\\.[0-9]+)?");
    if(reg.match(displayVal).hasMatch()){
        double dblDisplayVal = displayVal.toDouble();
        double dblDisplayValSign = -1 * dblDisplayVal;
        ui->Display->setText(QString::number(dblDisplayValSign));
}
}
void MyWidget::on_reciprocal_clicked()
{
    QString strValue = ui->Display->text();
    double value = strValue.toDouble();
if (value == 0)
{
        QMessageBox::warning(this, "Error", "Cannot divide by zero!");
        return;
}
    double result = 1 / value;
    ui->Display->setText(QString::number(result));
}
void MyWidget::on_percent_clicked()
{
    QString text = ui->Display->text();
    double value = text.toDouble();
    value = value / 100;
    QString result = QString::number(value);
    ui->Display->setText(result);
    if (value == 0)
    {
        QMessageBox::warning(this, "Error", "Cannot percent by zero!");
        return;
    }
}


void MyWidget::on_AllClear_clicked()
{
      ui->Display->clear();
}
void MyWidget::on_Clear_clicked()
{
    // 删除目前的数字
      QString text = ui->Display->text();
      text.chop(1); // 移除最后一个字符
      ui->Display->setText(text);
}
void MyWidget::on_MemAdd_clicked()
{
      QString currentNumber = ui->Display->text();
      QList<QString> memoryNumbers;
      if (currentNumber.isEmpty() || !currentNumber.toInt()) {

        return;
      }
      memoryNumbers.append(currentNumber);
}
void MyWidget::on_MemClear_clicked()
{
    ui->Display->clear();
}


void MyWidget::on_scientific_clicked()
{
    scientific *scientificWidget = new scientific();
    // 显示新的界面
    scientificWidget->show();
    this->hide();
}
void  scientific::on_standard_clicked()
{

    MyWidget* MyWidgetWidget = new MyWidget;
    MyWidgetWidget->show();//program窗口显示
    this->hide();//本窗口隐藏
    //this->close();
}

scientific.cpp

#include "scientific.h"
#include "ui_scientific.h"
#include "QRegularExpression"
#include "QMessageBox"
#include <cstring>
#include <math.h>
#include "ui_scientific.h"
double calcVal1 = 0.0;
bool divTrigger1 = false;
bool multTrigger1 = false;
bool addTrigger1= false;
bool subTrigger1 = false;
scientific::scientific(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::scientific)
{
    ui->setupUi(this);
    ui->Display->setText(QString::number(calcVal1));
    QPushButton *numButtons[10];
    for(int i=0;i<10;i++){
        QString buttonName = "Button" + QString::number((i));
        numButtons[i] = scientific::findChild<QPushButton *>(buttonName);
        connect(numButtons[i],SIGNAL(released()),this,SLOT(NumPressed()));
    }
    connect(ui->Add,SIGNAL(released()),this,SLOT(MathButtonPressed()));
    connect(ui->Subtract,SIGNAL(released()),this,SLOT(MathButtonPressed()));
    connect(ui->Multiply,SIGNAL(released()),this,SLOT(MathButtonPressed()));
    connect(ui->Divide,SIGNAL(released()),this,SLOT(MathButtonPressed()));
    connect(ui->Equals,SIGNAL(released()),this,SLOT(EqualButton()));
}

scientific::~scientific()
{
    delete ui;
}
void scientific::NumPressed()
{
    QPushButton *button = (QPushButton *)sender();
    QString butval = button->text();
    QString displayVal = ui->Display->text();
    if((displayVal.toDouble() == 0)||(displayVal.toDouble() == 0.0)){
        ui->Display->setText(butval);
    }
    else{
        QString newVal = displayVal+butval;
        double dblNewVal = newVal.toDouble();
        ui->Display->setText(QString::number(dblNewVal,'g',16));
    }
}
void scientific::MathButtonPressed()
{
    divTrigger1 = false;
    multTrigger1 = false;
    addTrigger1 = false;
    subTrigger1 = false;
    QString displayVal = ui->Display->text();
    calcVal1 = displayVal.toDouble();
    QPushButton *button = (QPushButton *)sender();
    QString butVal = button->text();
    if(QString::compare(butVal,"/",Qt::CaseInsensitive) == 0){
        divTrigger1 = true;
    }else if(QString::compare(butVal,"*",Qt::CaseInsensitive) == 0){
        multTrigger1 = true;
    }else if(QString::compare(butVal,"+",Qt::CaseInsensitive) == 0){
        addTrigger1 = true;
    }else if(QString::compare(butVal,"-",Qt::CaseInsensitive) == 0){
        subTrigger1 = true;
    }
    ui->Display->setText("");


}
void scientific::EqualButton()
{
    double solution = 0.0;
    QString displayVal = ui->Display->text();
    double dblDisplayVal = displayVal.toDouble();
    if(addTrigger1 || subTrigger1 || multTrigger1 || divTrigger1){
        if(addTrigger1){
            solution = calcVal1 + dblDisplayVal;
        }else if(subTrigger1){
            solution = calcVal1 - dblDisplayVal;
        }else if(multTrigger1){
            solution = calcVal1 * dblDisplayVal;
        }else if(divTrigger1){
            solution = calcVal1 / dblDisplayVal;
        }
    }
    ui->Display->setText(QString::number(solution));
}



void scientific::on_Point_clicked()
{
    if(ui->Display->text()=="")
        ui->Display->setText("0.");
    else
    if(ui->Display->text().contains(".")==true);
    else
        ui->Display->setText(ui->Display->text()+".");
}


void scientific::on_ChangeSign_clicked()
{
    QString displayVal = ui->Display->text();
    QRegularExpression reg("-?[0-9]+(?:\\.[0-9]+)?");
    if(reg.match(displayVal).hasMatch()){
        double dblDisplayVal = displayVal.toDouble();
        double dblDisplayValSign = -1 * dblDisplayVal;
        ui->Display->setText(QString::number(dblDisplayValSign));
}
}

void scientific::on_reciprocal_clicked()
{
    QString strValue = ui->Display->text();
    double value = strValue.toDouble();
    if (value == 0)
{
        QMessageBox::warning(this, "Error", "Cannot divide by zero!");
        return;
}
    double result = 1 / value;
    ui->Display->setText(QString::number(result));
}


void scientific::on_AllClear_clicked()
{
     ui->Display->clear();
}


void scientific::on_Clear_clicked()
{

     QString text = ui->Display->text();
     text.chop(1);
     ui->Display->setText(text);
}


void scientific::on_sin_clicked()
{
     double value = ui->Display->text().toDouble();
     double result = sin(value);
     ui->Display->setText(QString::number(result));
}
void scientific::on_cos_clicked()
{
     double value = ui->Display->text().toDouble();
     double result = cos(value);
     ui->Display->setText(QString::number(result));
}
void scientific::on_tan_clicked()
{
     double value = ui->Display->text().toDouble();
     double result = tan(value);
     ui->Display->setText(QString::number(result));
}
void scientific::on_pai_clicked()
{
     double Π = 3.14159265358979323846;
     ui->Display->setText(QString::number(Π));
}


void scientific::on_square_clicked()
{
     QString strValue = ui->Display->text();
     double value = strValue.toDouble();
     double result = value*value;
     ui->Display->setText(QString::number(result));
}


void scientific::on_sqrt_clicked()
{
     QString strValue = ui->Display->text();
     double value = strValue.toDouble();
     if (value < 0)
     {
        QMessageBox::warning(this, "Error", "Cannot calculate square root of a negative number!");
        return;
     }
     double result = sqrt(value);
     ui->Display->setText(QString::number(result));

}

void scientific::on_exp_clicked()
{
     QString strValue = ui->Display->text();
     double value = strValue.toDouble();
     double result = pow(10, value);
     ui->Display->setText(QString::number(result));

}
void scientific::on_factorial_clicked()
{
     int num = ui->Display->text().toInt();
         int factorial = 1;
     for (int i = 1; i <= num; i++) {
        factorial *= i;
     }
     ui->Display->setText(QString::number(factorial));
}


void scientific::on_log_clicked()
{
     QString input = ui->Display->text();
     double number = input.toDouble();
     double result = log10(number);
     ui->Display->setText(QString::number(result));
}


void scientific::on_exponent_clicked()
{

     double e = 2.71828;
                ui->Display->setText(QString::number(e));
}
void scientific::on_ln_clicked()
{
    QString input = ui->Display->text();
    double number = input.toDouble();
    double result = qLn(number);
    ui->Display->setText(QString::number(result));
}

void scientific::on_abs_clicked()
{
    double value = ui->Display->text().toDouble();
    double result = abs(value);
    ui->Display->setText(QString::number(result));
}

void scientific::on_tenN_clicked()
{
    double base = 10;
    int exponent = ui->Display->text().toInt(); // assuming there is a line edit for entering the exponent
    double result = pow(base, exponent);
    ui->Display->setText(QString::number(result));
}


void scientific::on_XN_clicked()
{
        QString xStr = ui->Display->text();
        QString nStr = ui->Display->text();
        double x = xStr.toDouble();
        int n = nStr.toInt();
        double result = pow(x, n);
        ui->Display->setText(QString::number(result));
    }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值