QT 应用程序之计算器

//cal.h
#ifndef CAL_H
#define CAL_H

#include <QWidget>
#include <QToolButton>
#include <QLineEdit>
#include <QLabel.h>
#include <QLayout>
 class cal:public QWidget
{
     Q_OBJECT

public:
    cal(QWidget *parent=0,QFlag f=0);
    ~cal();

private slots:
    void digitClick();
    void operatClick();
    void equalClick();
    void changesignClick();
    void pointClick();
    void backspaceCk();
    void clearAll();
    void clear();
    void clearMemory();
    void readMemory();
    void setMemory();
    void addToMemory();
    void unarryClick();
    void wrong();

private:
   QLineEdit *display;
   QToolButton *digitButton[10];
   double sum;
   double memory;
   double right;
   QString ch;
   bool waitingForOperand;


};



#endif // CAL_H

//cal.cpp
#include "cal.h"
#include <QtGui>
#include <cmath>

cal::cal(QWidget *parent,QFlag f):QWidget(parent)
{
    sum = 0.0;
       memory = 0.0;
       right = 0.0;
       ch = "";
       waitingForOperand = true;

       display = new QLineEdit("0");
       display->setReadOnly(true);
       display->setAlignment(Qt::AlignRight); display->setMaxLength(15);

       QFont font = display->font();
       font.setPointSize(font.pointSize() + 8);
       display->setFont(font);

       for (int i = 0; i < 10; ++i)
       {
           digitButton[i] = new QToolButton;
           digitButton[i]->setText(QString::number(i));
           connect(digitButton[i],SIGNAL(clicked()),this,SLOT(digitClick()));
       }

       QToolButton *clearMemoryBtn = new QToolButton;
       clearMemoryBtn->setText("MC");
       connect(clearMemoryBtn,SIGNAL(clicked()),this,SLOT(clearMemory()));

       QToolButton *readMemoryBtn = new QToolButton;
       readMemoryBtn->setText("MR");
       connect(readMemoryBtn,SIGNAL(clicked()),this,SLOT(readMemory()));

       QToolButton *setMemoryBtn = new QToolButton;
       setMemoryBtn->setText("MS");
       connect(setMemoryBtn,SIGNAL(clicked()),this,SLOT(setMemory()));

       QToolButton *addMemoryBtn = new QToolButton;
       addMemoryBtn->setText("M+");
       connect(addMemoryBtn,SIGNAL(clicked()),this,SLOT(addToMemory()));

       QToolButton *changeBtn = new QToolButton;
       changeBtn->setText("+/-");
       connect(changeBtn,SIGNAL(clicked()),this,SLOT(changesignClick()));

       QToolButton *pointBtn = new QToolButton;
       pointBtn->setText(".");
       connect(pointBtn,SIGNAL(clicked()),this,SLOT(pointClick()));

       QToolButton *mulBtn = new QToolButton;
       mulBtn->setText("*");
       connect(mulBtn,SIGNAL(clicked()),this,SLOT(operatClick()));

       QToolButton *divBtn = new QToolButton;
       divBtn->setText("/");
       connect(divBtn,SIGNAL(clicked()),this,SLOT(operatClick()));

       QToolButton *addBtn = new QToolButton;
       addBtn->setText("+");
       connect(addBtn,SIGNAL(clicked()),this,SLOT(operatClick()));

       QToolButton *subBtn = new QToolButton;
       subBtn->setText("-");
       connect(subBtn,SIGNAL(clicked()),this,SLOT(operatClick()));

       QToolButton *sqrtBtn = new QToolButton;
       sqrtBtn->setText("sqrt");
       connect(sqrtBtn,SIGNAL(clicked()),this,SLOT(unarryClick()));

       QToolButton *powBtn = new QToolButton;
       powBtn->setText("x2");
       connect(powBtn,SIGNAL(clicked()),this,SLOT(unarryClick()));

       QToolButton *countdownBtn = new QToolButton;
       countdownBtn->setText("1/x");
       connect(countdownBtn,SIGNAL(clicked()),this,SLOT(unarryClick()));

       QToolButton *equalBtn = new QToolButton;
       equalBtn->setText("=");
       connect(equalBtn,SIGNAL(clicked()),this,SLOT(equalClick()));

       QToolButton *backspaceBtn = new QToolButton;
       backspaceBtn->setText("Backspace");
       connect(backspaceBtn,SIGNAL(clicked()),this,SLOT(backspaceCk()));

       QToolButton *clearBtn = new QToolButton;
       clearBtn->setText("CE");
       connect(clearBtn,SIGNAL(clicked()),this,SLOT(clear()));

       QToolButton *clearAllBtn = new QToolButton;
       clearAllBtn->setText("C");
       connect(clearAllBtn,SIGNAL(clicked()),this,SLOT(clearAll()));

       QLabel *label = new QLabel;

       QGridLayout *calcu = new QGridLayout;
       for (int i = 0;i < 10; ++i)
       {
           if (i == 0)
               calcu->addWidget(digitButton[i],3,0);
           else
               calcu->addWidget(digitButton[i],(9 - i) / 3,i % 3 ? i % 3 - 1 : 2);
       }
       calcu->addWidget(changeBtn,3,1);
       calcu->addWidget(pointBtn,3,2);
       calcu->addWidget(divBtn,0,3);
       calcu->addWidget(mulBtn,1,3);
       calcu->addWidget(subBtn,2,3);
       calcu->addWidget(addBtn,3,3);
       calcu->addWidget(sqrtBtn,0,4);
       calcu->addWidget(powBtn,1,4);
       calcu->addWidget(countdownBtn,2,4);
       calcu->addWidget(equalBtn,3,4);

       QVBoxLayout *memoryLayout = new QVBoxLayout;
       memoryLayout->addWidget(clearMemoryBtn);
       memoryLayout->addWidget(readMemoryBtn);
       memoryLayout->addWidget(setMemoryBtn);
       memoryLayout->addWidget(addMemoryBtn);

       QHBoxLayout *cLayout = new QHBoxLayout;
       cLayout->addLayout(memoryLayout);
       cLayout->addLayout(calcu);

       QGridLayout *upLayout = new QGridLayout;
       upLayout->addWidget(display,0,0,1,4);
       upLayout->addWidget(label,0,1);
       upLayout->addWidget(backspaceBtn,1,1);
       upLayout->addWidget(clearBtn,1,2);
       upLayout->addWidget(clearAllBtn,1,3);

       QVBoxLayout *mainLayout = new QVBoxLayout;
       mainLayout->addLayout(upLayout);
       mainLayout->addLayout(cLayout);
       setLayout(mainLayout);

       setWindowTitle("calculator");
}


void cal::digitClick()
{
    QToolButton *clickedButton = qobject_cast<QToolButton *>(sender());
        int digit = clickedButton->text().toInt();
        if (display->text() == "0" && digit == 0)
            return;
        if (display->text() == "0")
            display->setText("");
        if (waitingForOperand == true)
        {
            display->clear();
            waitingForOperand = false;
        }
        display->setText(display->text() + QString::number(digit));
    // display->setText(display->text()+toolbutton->text());

}

void cal::operatClick()
{
//    if (waitingForOperand == false)
  //         return;
       QToolButton *clickedButton = qobject_cast<QToolButton *>(sender());
       sum = display->text().toDouble();
       ch = clickedButton->text();
       display->setText(display->text());
       waitingForOperand = true;
}

void cal::equalClick()
{

        if (ch == "")
            return;
        right = display->text().toDouble();
        if (ch == "+")
            sum += right;
        else if (ch == "-")
            sum -= right;
        else if (ch == "*")
            sum *= right;
        else if (ch == "/")
        {
            if (right == 0)
            {
                wrong();
                return;
            }
            sum /= right;

        }
        display->setText(QString::number(sum));
        ch = "";  //想去掉?  编写一个可以连续加或者减的
        waitingForOperand = true;//用waitingForOperand来表示下次点击数字按钮的时候要不要清屏
}

void cal::changesignClick()  //   +/-
{
    if (waitingForOperand ==true)
       {
           ch = "";
           waitingForOperand = false;
       }
       double digit = display->text().toDouble();
       digit = -digit;
       display->setText(QString::number(digit));

}

void cal::pointClick()
{
    if (waitingForOperand == true)
      {
          sum = display->text().toDouble();
          display->setText("0");
      }
      if (!display->text().contains("."))
          display->setText(display->text() + tr("."));
}

void cal::backspaceCk()
{
    if (waitingForOperand ==true)
            return;
        QString text = display->text();
        text.chop(1);
        if (text.isEmpty())
            text = '0';
        display->setText(text);

}

void cal::clearAll()
{
    sum = 0.0;
       memory = 0.0;
       right = 0.0;
       ch = "";
       waitingForOperand = true;
       display->setText("0");
}

void cal::clear()
{
    if (waitingForOperand == true)
          return;
      display->setText("0");

}

void cal::clearMemory()
{
    memory=0.0;
}

void cal::readMemory()
{
    display->setText(QString::number(memory));
}

void cal::setMemory()
{
    memory=display->text().toDouble();
}

void cal::addToMemory()
{
   double temp=display->text().toDouble();
   memory+=temp;
}

void cal::unarryClick()
{
      QToolButton *clickedButton = qobject_cast<QToolButton *>(sender());
      QString text=clickedButton->text();
      sum=display->text().toDouble();
      if(text=="x2")
         sum=sum*sum;
    if(text=="1/x")
       sum=1.0/sum;
    if(text=="sqrt")
        sum=sqrt(sum);
    display->setText(QString::number(sum));
}


void cal::wrong()
{
     display->setText("error");
}

cal::~cal()
{

}





                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值