可能没有考虑到所有情况,但基本的计算可以做到!
Calculator.h
#pragma once
#include <QtWidgets/QDialog>
#include "ui_Calculator.h"
#include "calculation.h"
#include <QPushButton>
#include <QLineEdit>
#include <QPlainTextEdit>
#include <cmath>
const int TOTALNUM = 10; // 数字键总数
const int OPERATORNUM = 6; // 操作符总数
const int WIDTH = 300; // 默认窗口宽度
const int HEIGHT = 450; // 默认窗口高度
const int ZOOMINWIDTH = 600; // 显示历史记录栏时的窗口宽度
const int BUTTONWIDTH = 60; // 按钮的宽度
const int BUTTONHEIGHT = 40; // 按钮的高度
const int SMALLBUTTONWIDTH = 30; // 小图标的宽度
const int SMALLBUTTONHEIGHT = 30; // 小图标的高度
class Calculator : public QDialog
{
Q_OBJECT
public:
Calculator(QWidget *parent = Q_NULLPTR);
private:
Ui::CalculatorClass ui;
private:
calculation c;
QPushButton *histotyButton;
QPushButton *numButton[TOTALNUM];
QPushButton *operatorButton[OPERATORNUM];
QPushButton *pointButton;
QPushButton *leftParenthesesButton;
QPushButton *rightParenthesesButton;
QPushButton *sinButton;
QPushButton *cosButton;
QPushButton *tanButton;
QPushButton *sqrtButton;
QPushButton *squareButton;
QPushButton *logButton;
QPushButton *expButton;
QPushButton *none1;
QPushButton *none2;
QPushButton *miciButton;
QPushButton *tenMiciButton;
QPushButton *factorialButton;
QPushButton *positiveAndNegativeButton;
QPushButton *piButton;
QPushButton *clearButton;
QPushButton *backspaceButton;
QLineEdit *expressionLineEdit;
QPlainTextEdit *historyResultTextEdit;
private:
void initButton();
void setButton(QPushButton * button, const QString & filePath, const int & width, const int & height, const int & buttonWidth = BUTTONWIDTH, const int & buttonHeight = BUTTONHEIGHT);
void initLineEdit();
char* getLastNum();
private slots:
void onNumButtonClicked(const qreal & num);
void onOperatorButtonClicked(const char & operatorName);
void backspaceButtonClicked();
void clearButtonClicked();
void triFunButtonClicked(const QString & tri);
void squareButtonClicked();
void sqrtButtonClicked();
void powButtonClicked();
void tenPowButtonClicked();
void positiveAndNegativeButtonClicked();
void eFunButtonClicked(const QString & e);
void histotyButtonClicked();
};
Calculaor.cpp
#include "Calculator.h"
bool zoomin = false; // 是否放大(显示历史栏)
const char OPERATOR[] = "%/*-+=";
Calculator::Calculator(QWidget *parent)
: QDialog(parent)
{
ui.setupUi(this);
// 初始化
initButton();
initLineEdit();
}
// 简单计算阶乘
double factorial(int n) {
double res = 1;
while (n > 0) {
res *= n;
n--;
}
return res;
}
void Calculator::initButton()
{
setMinimumSize(WIDTH, HEIGHT);
setMaximumSize(WIDTH, HEIGHT);
QString iconPath;
int j = 1;
int i;
// 初始化数字按钮
for (i = 0; i < TOTALNUM; ++i) {
numButton[i] = new QPushButton(this);
iconPath = "./img/num" + QString::number(i) + ".png";
if (i == 0) {
setButton(numButton[i], iconPath, (WIDTH - BUTTONWIDTH) >> 1, HEIGHT - BUTTONHEIGHT);
}
else {
if (i % 3 == 1) {
j++;
}
setButton(numButton[i], iconPath, BUTTONWIDTH * ((i - 1) % 3 + 1), HEIGHT - j * BUTTONHEIGHT);
}
// 通过lamda表达式进行传参
connect(numButton[i], &QPushButton::clicked, this, [=] {onNumButtonClicked(i); });
}
// 初始化加 减 乘 除 取余 等于
for (i = 0; i < OPERATORNUM; ++i) {
operatorButton[i] = new QPushButton(this);
iconPath = "./img/operator" + QString::number(i + 1) + ".png";
setButton(operatorButton[i], iconPath, WIDTH - BUTTONWIDTH, HEIGHT - BUTTONHEIGHT * (OPERATORNUM - i));
connect(operatorButton[i], &QPushButton::clicked, this, [=] {onOperatorButtonClicked(OPERATOR[i]); });
}
// 初始化小数点按钮
pointButton = new QPushButton(this);
setButton(pointButton, "./img/point.png", WIDTH - BUTTONWIDTH * 2, HEIGHT - BUTTONHEIGHT);
connect(pointButton, &QPushButton::clicked, this, [=] {onOperatorButtonClicked('.'); });
// 初始化左括号按钮
leftParenthesesButton = new QPushButton(this);
setButton(leftParenthesesButton, "./img/leftParentheses.png", 0, HEIGHT - BUTTONHEIGHT);
connect(leftParenthesesButton, &QPushButton::clicked, this, [=] {onOperatorButtonClicked('('); });
// 初始化右括号按钮
rightParenthesesButton = new QPushButton(this);
setButton(rightParenthesesButton, "./im