运用qt实现计算器页面

首先我们在界面文件中画出我们想要的 计算器的模型, 如下图所示:

然后,对于每一个按键进行修改名称,使之便于后续代码的书写。

之后我们对每一个按键转到槽,在源文件中进行对每个按键的功能进行书写:

对于除“=”以外的按键,都较容易实现他们的功能,对于“=”号按键,将在此按键中实现计算器加减乘除的所有功能。

void Widget::on_oneButton_clicked()
{
    expression +="1";
    ui->mainLineEdit->setText(expression);
}


void Widget::on_twoButton_clicked()
{
    expression +="2";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_threeButton_clicked()
{
    expression +="3";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_fourButton_clicked()
{
    expression +="4";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_fiveButton_clicked()
{
    expression +="5";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_sixButton_clicked()
{
    expression +="6";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_sevenButton_clicked()
{
    expression +="7";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_eightButton_clicked()
{
    expression +="8";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_nineButton_clicked()
{
    expression +="9";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_addButton_clicked()
{
    expression +="+";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_decButton_clicked()
{
    expression +="-";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_mulButton_clicked()
{
    expression +="*";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_decButton_2_clicked()
{
    expression +="/";
    ui->mainLineEdit->setText(expression);
}


void Widget::on_leftButton_clicked()
{
    expression +="(";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_rightButton_clicked()
{
    expression +=")";
    ui->mainLineEdit->setText(expression);
}

void Widget::on_clearButton_clicked()
{

    ui->mainLineEdit->clear();
    expression.clear();
}

void Widget::on_delButton_2_clicked()
{
    expression.chop(1);
    ui->mainLineEdit->setText(expression);
}

void Widget::on_zeroButton_clicked()
{
    expression +="0";
    ui->mainLineEdit->setText(expression);
}
int Widget::Priority(char ch)
{
    switch(ch)
    {
        case '(':
            return 3;
        case '*':
        case '/':
            return 2;
        case '+':
        case '-':
            return 1;
        default:
            return 0;
    }

}
void Widget::on_equButton_clicked()
{
    int i=0,tmp=0,num1,num2,result;
    QStack<int> s_opt, s_num;
    QByteArray data=expression.toLatin1();
    char *opt=data.data();
    char ch;
    while(opt[i]!='\0'||s_opt.empty()!=true)
    {
        if(opt[i]>='0'&&opt[i]<='9')
        {
            tmp=tmp*1+opt[i]-'0';
            i++;
            if(opt[i]>'9'||opt[i]<'0')
            {
                s_num.push(tmp);
                tmp=0;
            }
        }
        else
        {
            //操作符进栈
            if(s_opt.empty()||(s_opt.top()=='('&&opt[i]!=')')||Priority(opt[i])>Priority(s_opt.top()))
            {
                s_opt.push(opt[i]);
                i++;
                continue;
            }
            if(s_opt.top()=='('&&opt[i]==')')
            {
                s_opt.pop();
                i++;
                continue;
            }
            if((opt[i]==')'&&s_opt.top()!='(')||Priority(opt[i])<=Priority(s_opt.top()))
            {
                ch=s_opt.top();
                s_opt.pop();
                switch(ch)
                {
                      case '+':
                            num1 = s_num.top();
                            s_num.pop();
                            num2 = s_num.top();
                            s_num.pop();
                            s_num.push(num1 + num2);
                            break;
                       case '-':
                            num1 = s_num.top();
                            s_num.pop();
                            num2 = s_num.top();
                            s_num.pop();
                            s_num.push(num2 - num1);
                            break;
                        case '*':
                            num1 = s_num.top();
                            s_num.pop();
                            num2 = s_num.top();
                            s_num.pop();
                            s_num.push(num1 * num2);
                            break;
                        case '/':
                            num1 = s_num.top();
                            s_num.pop();
                            num2 = s_num.top();
                            s_num.pop();
                            s_num.push(num2 / num1);
                            break;
                  }
            }
         }
      }
        result = s_num.top();
        ui->mainLineEdit->setText(QString::number(result));
        expression.clear();

}

 注意头文件的书写

执行完成后的页面将如下图所示:

按等于键后将会出现结果。 

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现一个计算器,可以使用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(); } ``` 这是一个非常简单的计算器,可以通过添加更多的操作符和逻辑来扩展它。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值