• 4897阅读
  • 2回复

一个计算器程序,看看哪错了 [复制链接]

上一主题 下一主题
离线cblcz
 
只看楼主 倒序阅读 楼主  发表于: 2010-02-15
//calc.h
#ifndef CALC_H
#define CALC_H

#include <QtGui/QMainWindow>
#include <QToolButton>
#include <QLineEdit>

class QToolButton;
class QLineEdit;

class calc : public QWidget
{
    Q_OBJECT

public:
    calc(QWidget *parent = 0);
    ~calc();

public 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 // CALC_H



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

calc::calc(QWidget *parent)
    : 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 = new QToolButton;
        digitButton->setText(QString::number(i));
        connect(digitButton,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(operatClick()));

    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,3,0);
        else
            calcu->addWidget(digitButton,(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 calc::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 == false)
    {
        display->clear();
        waitingForOperand = true;
    }
    display->setText(display->text() + QString::number(digit));
}

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

void calc::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;
}

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

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

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

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

void calc::clear()
{
    if (waitingForOperand == false)
        return;
    display->setText("0");
}

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

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

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

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

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

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

calc::~calc()
{

}


//main.cpp
#include <QtGui/QApplication>
#include "calc.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    calc w;
    w.show();
    return a.exec();
}


问题是点了=按钮,不出结果(没反应)
希望大神们帮忙看看,谢谢啦
离线steinlee

只看该作者 1楼 发表于: 2010-02-18
    for (int i = 0; i < 10; ++i)
    {
        digitButton = new QToolButton;
        digitButton->setText(QString::number(i));
        connect(digitButton,SIGNAL(clicked()),this,SLOT(digitClick()));
    }

In this loop you created only one button ten times. There is memory leak. I think you want to create ten buttons.
class name should have upper case like class Calc. Why not use full name Calculator to make your code clearer?
It is better to write your code like a book in order to let other people understand your code easily. Note that code
maintenance is expensive.
[ 此帖被steinlee在2010-02-18 01:13重新编辑 ]
Looking for remote C/C++ and Qt 兼职
离线wuleeemail

只看该作者 2楼 发表于: 2010-02-20
引用第1楼steinlee于2010-02-18 01:04发表的  :
    for (int i = 0; i < 10; ++i)
    {
        digitButton = new QToolButton;
        digitButton->setText(QString::number(i));
        connect(digitButton,SIGNAL(clicked()),this,SLOT(digitClick()));
.......

他这段代码是有问题,但我感到问题还不在这里,我们可以把这段代码(还有相关的代码)修改或者屏蔽掉,这个程序仍然出不来。
快速回复
限100 字节
 
上一个 下一个