QT实现简易计算器(手把手教学)

        本文章只实现了最最基础的计算器功能,相比起一般的计算器还有些不足,强烈建议读者在阅读完本文章之后,在已经了解的情况下,对其进行优化,如想实现更多功能,建议将LCD控件改为Text edit控件。


废话不多说,先上图:

QT创建项目应该不用多说,在创建项目之后打开Forms目录下的ui文件(双击)

根据自己的喜好和想要实现的功能加入空间,此计算器只使用了Push button控件、LCD number控件,同时记住修改控件对象名称方便记忆使用

此时注意,LCD控件默认只能显示5个数字,因此我们需要进行修改,同时在LCD最多只显示10个数字,在编写代码时我们会对其进行设置

选中lcd控件,在右下侧寻找digitCount选项,修改需要显示的数字,我修改的是12

计算器界面设置好后,就需要我们对其进行信号和槽的编写了

数字键:

右键数字控件,点击转到槽,选择clicked点击事件,跳转到代码界面

因为LCD只显示10位,我们定义一个全局变量cont,然后编程

void MainWindow::on_one_clicked()    //数字1的槽函数
{
    if(cont < 10)    //在文件头部定义的全局变量
    {
        int num = ui->evaDisplay->value();    //evaDisplay是我给lcd显示屏的对象名字
        num = num * 10 + 1;
        ui->evaDisplay->display(num);
        cont++;
    }
}

哪个数字的按键,就在num * 10 + 后面加上对应数字

清空键:

同数字键一样转到槽

void MainWindow::on_clear_clicked()
{
    ui->evaDisplay->display(0);
    cont = 0;
}

运算符键:

同数字键一样转到槽

通过观察计算器我们可以发现,一般的计算器是在输入一串数字后,点击运算符时,显示屏清空,此时输入第二串数字,最后点击等于才会出现结果,因此我们在点击运算符时,使用全局变量num1存储第一次的值,全局变量res存储哪个运算的操作。

void MainWindow::on_myAdd_clicked()    //+号
{
    num1 = ui->evaDisplay->value();
    on_clear_clicked();    //清空键
    res = 1;
}

等于键:

读取res获取当前操作

void MainWindow::on_result_clicked()
{
    switch (res)
    {
        case 1:    //+
            num2 = ui->evaDisplay->value();
            ui->evaDisplay->display(num1 + num2);
            break;
        case 2:    //-
            num2 = ui->evaDisplay->value();
            ui->evaDisplay->display(num1 - num2);
            break;
        case 3:    //*
            num2 = ui->evaDisplay->value();
            ui->evaDisplay->display(num1 * num2);
            break;
        case 4:    //“/”
            num2 = ui->evaDisplay->value();
            ui->evaDisplay->display(num1 / num2);
            break;
        case 5:    //%
            num2 = ui->evaDisplay->value();
            ui->evaDisplay->display(num1 % num2);
            break;
    }
}

退格键:

每次退格会重新计算cont,因为前面未对cont上限进行限制,避免cont溢出,导致LCD显示数量变化

void MainWindow::on_point_clicked()
{
    int num = ui->evaDisplay->value();
    cont = 0;
    ui->evaDisplay->display(num / 10);
    num /= 10;
    while(num != 0)
    {
        num /= 10;
        cont++;
        //qDebug() << cont;
    }
}

全局变量:

int cont = 0,num1 = 0,num2 = 0,res = 0;

至此,计算器实现,所有代码将一并奉上:

#include "mainwindow.h"
#include "ui_mainwindow.h"

int cont = 0,num1 = 0,num2 = 0,res = 0;

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

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


void MainWindow::on_one_clicked()
{
    if(cont < 10)
    {
        int num = ui->evaDisplay->value();
        num = num * 10 + 1;
        //num = static_cast<float>(num);
        ui->evaDisplay->display(num);
        cont++;
    }
}


void MainWindow::on_two_clicked()
{
    cont++;
    if(cont < 10)
    {
        int num = ui->evaDisplay->value();
        num = num * 10 + 2;
        ui->evaDisplay->display(num);
    }
}


void MainWindow::on_three_clicked()
{
    cont++;
    if(cont < 10)
    {
        int num = ui->evaDisplay->value();
        num = num * 10 + 3;
        ui->evaDisplay->display(num);
    }
}


void MainWindow::on_four_clicked()
{
    cont++;
    if(cont < 10)
    {
        int num = ui->evaDisplay->value();
        num = num * 10 + 4;
        ui->evaDisplay->display(num);
    }
}


void MainWindow::on_five_clicked()
{
    cont++;
    if(cont < 10)
    {
        int num = ui->evaDisplay->value();
        num = num * 10 + 5;
        ui->evaDisplay->display(num);
    }
}


void MainWindow::on_six_clicked()
{
    cont++;
    if(cont < 10)
    {
        int num = ui->evaDisplay->value();
        num = num * 10 + 6;
        ui->evaDisplay->display(num);
    }
}


void MainWindow::on_seven_clicked()
{
    cont++;
    if(cont < 10)
    {
        int num = ui->evaDisplay->value();
        num = num * 10 + 7;
        ui->evaDisplay->display(num);
    }
}


void MainWindow::on_eight_clicked()
{
    cont++;
    if(cont < 10)
    {
        int num = ui->evaDisplay->value();
        num = num * 10 + 8;
        ui->evaDisplay->display(num);
    }
}


void MainWindow::on_nine_clicked()
{
    cont++;
    if(cont < 10)
    {
        int num = ui->evaDisplay->value();
        num = num * 10 + 9;
        ui->evaDisplay->display(num);
    }
}


void MainWindow::on_zero_clicked()
{
    if(cont < 10)
    {
        int num = ui->evaDisplay->value();
        num = num * 10 + 0;
        ui->evaDisplay->display(num);
        if(num != 0)
        {cont++;}
    }
}


void MainWindow::on_clear_clicked()
{
    ui->evaDisplay->display(0);
    cont = 0;
}


void MainWindow::on_myAdd_clicked()
{
    num1 = ui->evaDisplay->value();
    on_clear_clicked();
    res = 1;
}


void MainWindow::on_myDowns_clicked()
{
    num1 = ui->evaDisplay->value();
    on_clear_clicked();
    res = 2;
}


void MainWindow::on_myBy_clicked()
{
    num1 = ui->evaDisplay->value();
    on_clear_clicked();
    res = 3;
}


void MainWindow::on_myExcept_clicked()
{
    num1 = ui->evaDisplay->value();
    on_clear_clicked();
    res = 4;
}


void MainWindow::on_moreThan_clicked()
{
    num1 = ui->evaDisplay->value();
    on_clear_clicked();
    res = 5;
}


void MainWindow::on_result_clicked()
{
    switch (res)
    {
        case 1:
            num2 = ui->evaDisplay->value();
            ui->evaDisplay->display(num1 + num2);
            break;
        case 2:
            num2 = ui->evaDisplay->value();
            ui->evaDisplay->display(num1 - num2);
            break;
        case 3:
            num2 = ui->evaDisplay->value();
            ui->evaDisplay->display(num1 * num2);
            break;
        case 4:
            num2 = ui->evaDisplay->value();
            ui->evaDisplay->display(num1 / num2);
            break;
        case 5:
            num2 = ui->evaDisplay->value();
            ui->evaDisplay->display(num1 % num2);
            break;
    }
}


void MainWindow::on_point_clicked()
{
    int num = ui->evaDisplay->value();
    cont = 0;
    ui->evaDisplay->display(num / 10);
    num /= 10;
    while(num != 0)
    {
        num /= 10;
        cont++;
        //qDebug() << cont;
    }
}

  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现一个计算器,可以使用Qt Creator创建一个新的Qt Widgets应用程序。然后,在Qt Designer中创建一个用户界面,包括数字和操作符按钮以及一个显示结果的文本框。 接下来,需要编写C++代码实现计算器的逻辑。可以使用Qt的信号槽机制来连接按钮的点击事件和计算器逻辑的函数。例如,当数字按钮被点击时,将数字添加到正在处理的数字中。当操作符按钮被点击时,将正在处理的数字和之前的数字一起计算,并更新结果文本框。 以下是一个简单的示例代码,仅实现了加法和减法操作: ``` #include <QtCore> #include <QtGui> class Calculator : public QWidget { Q_OBJECT public: Calculator(QWidget *parent = 0); private slots: void digitClicked(); void operatorClicked(); private: QPushButton *createButton(const QString &text, const char *member); void calculate(); double sum; double currentNumber; QString currentOperator; QLineEdit *display; }; Calculator::Calculator(QWidget *parent) : QWidget(parent), sum(0), currentNumber(0) { display = new QLineEdit("0"); display->setReadOnly(true); display->setAlignment(Qt::AlignRight); display->setMaxLength(15); QGridLayout *layout = new QGridLayout; layout->addWidget(display, 0, 0, 1, 4); layout->addWidget(createButton("7", SLOT(digitClicked())), 1, 0); layout->addWidget(createButton("8", SLOT(digitClicked())), 1, 1); layout->addWidget(createButton("9", SLOT(digitClicked())), 1, 2); layout->addWidget(createButton("+", SLOT(operatorClicked())), 1, 3); layout->addWidget(createButton("4", SLOT(digitClicked())), 2, 0); layout->addWidget(createButton("5", SLOT(digitClicked())), 2, 1); layout->addWidget(createButton("6", SLOT(digitClicked())), 2, 2); layout->addWidget(createButton("-", SLOT(operatorClicked())), 2, 3); layout->addWidget(createButton("1", SLOT(digitClicked())), 3, 0); layout->addWidget(createButton("2", SLOT(digitClicked())), 3, 1); layout->addWidget(createButton("3", SLOT(digitClicked())), 3, 2); layout->addWidget(createButton("=", SLOT(operatorClicked())), 3, 3); layout->addWidget(createButton("0", SLOT(digitClicked())), 4, 0, 1, 2); layout->addWidget(createButton(".", SLOT(digitClicked())), 4, 2); layout->addWidget(createButton("C", SLOT(operatorClicked())), 4, 3); setLayout(layout); } QPushButton *Calculator::createButton(const QString &text, const char *member) { QPushButton *button = new QPushButton(text); connect(button, SIGNAL(clicked()), this, member); return button; } void Calculator::digitClicked() { QPushButton *button = qobject_cast<QPushButton*>(sender()); Q_ASSERT(button != 0); int digitValue = button->text().toInt(); currentNumber = currentNumber * 10 + digitValue; display->setText(QString::number(currentNumber)); } void Calculator::operatorClicked() { QPushButton *button = qobject_cast<QPushButton*>(sender()); Q_ASSERT(button != 0); QString clickedOperator = button->text(); if (clickedOperator == "C") { sum = 0; currentNumber = 0; currentOperator = ""; display->setText("0"); return; } if (!currentOperator.isEmpty()) { calculate(); } currentOperator = clickedOperator; sum = currentNumber; currentNumber = 0; } void Calculator::calculate() { if (currentOperator == "+") { sum += currentNumber; } else if (currentOperator == "-") { sum -= currentNumber; } currentNumber = 0; display->setText(QString::number(sum)); } int main(int argc, char *argv[]) { QApplication app(argc, argv); Calculator calc; calc.setWindowTitle("Calculator"); calc.show(); return app.exec(); } ``` 这是一个非常简单的计算器,可以通过添加更多的操作符和逻辑来扩展它。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值