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));
}