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()
{
 
}
 
 
 

                
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值