Qt分数计算器计算结果错误问题

下面是一段分数计算的Qt代码,运行后显示界面,在界面上不管输入什么,运算结果在输出框中都是0,是代码有什么问题吗?

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QDebug>

const int MainWindow::MAX_INPUT_LENGTH;

Fraction::Fraction(int num, int den) : numerator(num), denominator(den) {
    if (denominator == 0) {
        numerator = 0;
        denominator = 1;
    }
}

Fraction Fraction::operator+(const Fraction& other) const {
    int jiaDen = denominator * other.denominator;
    int jiaNum = numerator * other.denominator + other.numerator * denominator;
    return Fraction(jiaNum, jiaDen).simplified();
}

Fraction Fraction::operator-(const Fraction& other) const {
    int commonDen = denominator * other.denominator;
    int commonNum = numerator * other.denominator - other.numerator * denominator;
    return Fraction(commonNum, commonDen).simplified();
}

Fraction Fraction::operator*(const Fraction& other) const {
    int chengNum = numerator * other.numerator;
    int chengDen = denominator * other.denominator;
    return Fraction(chengNum, chengDen).simplified();
}

Fraction Fraction::operator/(const Fraction& other) const {
    if (other.numerator == 0) {
        // 除数为零
        throw std::invalid_argument("Division by zero!");
    }
    int newNum = numerator * other.denominator;
    int newDen = denominator * other.numerator;
    return Fraction(newNum, newDen).simplified();
}

Fraction Fraction::simplified() const {
    int gcd = 1;
    for (int i = 2; i <= std::min(numerator, denominator); i++) {
        if (numerator % i == 0 && denominator % i == 0) {
            gcd = i;
        }
    }
    return Fraction(numerator / gcd, denominator / gcd);
}

Fraction MainWindow::parseFraction(const QString &input) {
    QStringList parts = input.split('/');
    int numerator = parts[0].toInt();
    int denominator = (parts.size() > 1) ? parts[1].toInt() : 1;
    return Fraction(numerator, denominator);
}

QString Fraction::toString() const {
    if (denominator == 1) {
        return QString::number(numerator);
    }
    else {
        return QString::number(numerator) + "/" + QString::number(denominator);
    }
}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow), operand1(0, 1), operand2(0,1)
{
    ui->setupUi(this);

    connect(ui->numberButton_0, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
    connect(ui->numberButton_1, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
    connect(ui->numberButton_2, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
    connect(ui->numberButton_3, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
    connect(ui->numberButton_4, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
    connect(ui->numberButton_5, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
    connect(ui->numberButton_6, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
    connect(ui->numberButton_7, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
    connect(ui->numberButton_8, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
    connect(ui->numberButton_9, SIGNAL(clicked()), this, SLOT(on_numberButton_clicked()));
    connect(ui->plusButton, SIGNAL(clicked()), this, SLOT(on_plusButton_clicked()));
    connect(ui->minusButton, SIGNAL(clicked()), this, SLOT(on_minusButton_clicked()));
    connect(ui->multiplyButton, SIGNAL(clicked()), this, SLOT(on_multiplyButton_clicked()));
    connect(ui->divideButton, SIGNAL(clicked()), this, SLOT(on_divideButton_clicked()));
    connect(ui->fractionLineButton, SIGNAL(clicked()), this, SLOT(on_fractionLineButton_clicked()));
    connect(ui->equalButton, SIGNAL(clicked()), this, SLOT(on_equalButton_clicked()));

}


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

void MainWindow::on_numberButton_clicked()
{
    QPushButton* button = qobject_cast<QPushButton*>(sender());
    QString number = button->text();
    appendToInput(number);
}

void MainWindow::on_plusButton_clicked()
{
    operand1 = parseFraction(currentNumber);
    currentOperator = "+";
    clearInput();
    setOutput("");
}

void MainWindow::on_minusButton_clicked()
{
    operand1 = parseFraction(currentNumber);
    currentOperator = "-";
    clearInput();
    setOutput("");
}

void MainWindow::on_multiplyButton_clicked()
{
    operand1 = parseFraction(currentNumber);
    currentOperator = "*";
    clearInput();
    setOutput("");
}

void MainWindow::on_divideButton_clicked()
{
    operand1 = parseFraction(currentNumber);
    currentOperator = "/";
    clearInput();
    setOutput("");
}

void MainWindow::on_fractionLineButton_clicked()
{
    // 获取当前输入框的内容
    QString input = currentNumber;

    // 如果输入框为空,或者以非数字字符结尾(例如已经存在一个“/”),
    // 则不需要添加分数线
    if (input.isEmpty() || !input.back().isDigit()) {
        return;
    }

    // 添加分数线
    appendToInput("/");
}


void MainWindow::on_equalButton_clicked()
{
    try {
        operand2 = parseFraction(currentNumber);
        clearInput();
        calculateResult();
    }
    catch (const std::invalid_argument& e) {
        setOutput(QString::fromStdString(e.what()));
    }
}


void MainWindow::appendToInput(QString number)
{
    if (currentNumber.length() >= MAX_INPUT_LENGTH) {
        return;
    }
    currentNumber.append(number);
    setInput(currentNumber);
}


void MainWindow::clearInput()
{
    currentNumber.clear();
    setInput("");
}

void MainWindow::clearOutput()
{
    setOutput("");
}

void MainWindow::setInput(QString input) {
    ui->inputLineEdit->setText(input);
    currentNumber = input;
}


void MainWindow::setOutput(QString output) {
    ui->outputLineEdit->setText(output);
}


void MainWindow::calculateResult() {
    Fraction result;
    QString output;

    if (currentOperator == "+") {
        result = operand1 + operand2;
    }
    else if (currentOperator == "-") {
        result = operand1 - operand2;
    }
    else if (currentOperator == "*") {
        result = operand1 * operand2;
    }
    else if (currentOperator == "/") {
        result = operand1 / operand2;
    }

    output = result.toString();
    setOutput(output);
}

img

img

img

看你等于按钮事件处理

你的 MAX_INPUT_LENGTH 没有赋值 看着是静态变量那就是0, 一直解析各个分数各个数都是0 ,所以无论怎样算都是 0。

你给个值 10 比如

const int MainWindow::MAX_INPUT_LENGTH = 10;