天天看点

QT实现一个简单的计算器

最近几天在学习QT,在了解了信号和槽机制、布局管理、还有一些控件的使用后,便试着写了一个计算器,带自定义的快捷键,剪贴板(复制和粘贴)的操作,有 菜单栏->选择 里的功能还未实现,等啥时候有时间把它补上吧。还有许多不足和需要修改的地方,希望各位大牛能帮忙指出其中的问题,谢谢。

下面就贴出我的代码:

calcMainWindow.h:

#ifndef CALCMAINWINDOW_H
#define CALCMAINWINDOW_H

#include <QMainWindow>
#include <QLineEdit>
#include <QPushButton>
#include <QGridLayout>
#include <QString>
#include <QVector>
#include <QKeyEvent>
#include <QLabel>
#include <QMenu>
#include <QAction>

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

    QString temp;

    double number;
    void operation();           //运算
    void keyPressEvent(QKeyEvent *);       //键盘响应
    void creatAction();         //创建菜单栏选项
    void creatMenu();           //创建菜单

private:
    //菜单控件(功能尚未添加)
    QMenu *chooseMenu;          //“选择”菜单
    QMenu *editMenu;            //“编辑”菜单
    QMenu *helpMenu;            //“帮助”菜单

    QAction *standerAction;     //标准
    QAction *scienceAction;     //科学
    QAction *historyAction;     //历史记录
    QAction *dateAction;        //日期计算
    QAction *copyAction;        //复制
    QAction *pasteAction;       //粘贴
    QAction *helpAction;        //查看帮助
    QAction *aboutAction;       //关于

    //计算器相关控件
    QLabel *operationLabel;
    QLabel *resultLabel;

    QLineEdit *showTextEdit;    //表达式显示栏
    QLineEdit *resultTextEdit;  //结果显示栏
    QPushButton *backBtn;       //回退
    QPushButton *ceBtn;         //清除
    QPushButton *clearBtn;      //清空
    QPushButton *oneBtn;
    QPushButton *twoBtn;
    QPushButton *threeBtn;
    QPushButton *fourBtn;
    QPushButton *fiveBtn;
    QPushButton *sixBtn;
    QPushButton *sevenBtn;
    QPushButton *eightBtn;
    QPushButton *nineBtn;
    QPushButton *zeroBtn;
    QPushButton *pointBtn;      //.
    QPushButton *signBtn;       //+/-

    //四则运算
    QPushButton *addBtn;
    QPushButton *subBtn;
    QPushButton *mulBtn;
    QPushButton *divideBtn;
    QPushButton *isBtn;

public slots:
    void button_1_click();
    void button_2_click();
    void button_3_click();
    void button_4_click();
    void button_5_click();
    void button_6_click();
    void button_7_click();
    void button_8_click();
    void button_9_click();
    void button_0_click();

    void button_add_click();
    void button_sub_click();
    void button_mul_click();
    void button_divide_click();
    void button_is_click();

    void button_cls_click();
    void button_ce_click();
    void button_back_click();
    void button_point_click();
    void button_sign_click();

    void helpMessageBox();
    void aboutMessageBox();

    void copyResult();
    void pasteNumber();
};

#endif // CALCMAINWINDOW_H
           

calcMainWindow.cpp:

#include "calcMainWindow.h"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QRect>
#include <QMenuBar>
#include <QMessageBox>
#include <QClipboard>
#include <QApplication>

bool num2 = false;      //判断是否只有一个数
int operator1 = 0;      //运算符标记:+(1),-(2),*(3),/(4)
double result = 0;      //结果
bool flag = false;      //标记分母是否为0

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    QWidget *centerWindow = new QWidget;
    this->setCentralWidget(centerWindow);

    creatAction();
    creatMenu();

    //标签
    operationLabel = new QLabel("Operation:");
    resultLabel = new QLabel("Result:");
    //显示栏
    showTextEdit = new QLineEdit;
    showTextEdit->setReadOnly(true);    //设为只读属性
    resultTextEdit = new QLineEdit;
    showTextEdit->setReadOnly(true);

    //键盘按钮
    backBtn = new QPushButton("←");
    ceBtn = new QPushButton("CE");
    clearBtn = new QPushButton("CLS");
    oneBtn = new QPushButton("1");
    twoBtn = new QPushButton("2");
    threeBtn = new QPushButton("3");
    fourBtn = new QPushButton("4");
    fiveBtn = new QPushButton("5");
    sixBtn = new QPushButton("6");
    sevenBtn = new QPushButton("7");
    eightBtn = new QPushButton("8");
    nineBtn = new QPushButton("9");
    zeroBtn = new QPushButton("0");
    pointBtn = new QPushButton(".");
    isBtn = new QPushButton("=");
    isBtn->setStyleSheet("background-color: rgb(255,80,20)");
    addBtn = new QPushButton("+");
    subBtn = new QPushButton("-");
    mulBtn = new QPushButton("*");
    divideBtn = new QPushButton("/");
    signBtn = new QPushButton("+/-");
    //设置布局
    QHBoxLayout *H0 = new QHBoxLayout;
    H0->addWidget(operationLabel);
    H0->addWidget(resultLabel);
    H0->setStretch(0,2);
    H0->setStretch(1,1);

    QHBoxLayout *H1 = new QHBoxLayout;
    H1->addWidget(showTextEdit);
    H1->addWidget(resultTextEdit);
    H1->setStretch(0,2);
    H1->setStretch(1,1);

    QHBoxLayout *H2 = new QHBoxLayout;
    H2->addWidget(backBtn);
    H2->addWidget(ceBtn);
    H2->addWidget(clearBtn);
    H2->addWidget(addBtn);

    QHBoxLayout *H3 = new QHBoxLayout;
    H3->addWidget(sevenBtn);
    H3->addWidget(eightBtn);
    H3->addWidget(nineBtn);
    H3->addWidget(subBtn);

    QHBoxLayout *H4 = new QHBoxLayout;
    H4->addWidget(fourBtn);
    H4->addWidget(fiveBtn);
    H4->addWidget(sixBtn);
    H4->addWidget(mulBtn);

    QHBoxLayout *H5 = new QHBoxLayout;
    H5->addWidget(oneBtn);
    H5->addWidget(twoBtn);
    H5->addWidget(threeBtn);
    H5->addWidget(divideBtn);

    QHBoxLayout *H6 = new QHBoxLayout;
    H6->addWidget(signBtn);
    H6->addWidget(zeroBtn);
    H6->addWidget(pointBtn);
    H6->addWidget(isBtn);

    QVBoxLayout *mainLayout = new QVBoxLayout;
    mainLayout->addLayout(H0);
    mainLayout->addLayout(H1);
    mainLayout->addLayout(H2);
    mainLayout->addLayout(H3);
    mainLayout->addLayout(H4);
    mainLayout->addLayout(H5);
    mainLayout->addLayout(H6);

    connect(oneBtn, SIGNAL(clicked()), this, SLOT(button_1_click()));
    connect(twoBtn, SIGNAL(clicked()), this, SLOT(button_2_click()));
    connect(threeBtn, SIGNAL(clicked()), this, SLOT(button_3_click()));
    connect(fourBtn, SIGNAL(clicked()), this, SLOT(button_4_click()));
    connect(fiveBtn, SIGNAL(clicked()), this, SLOT(button_5_click()));
    connect(sixBtn, SIGNAL(clicked()), this, SLOT(button_6_click()));
    connect(sevenBtn, SIGNAL(clicked()), this, SLOT(button_7_click()));
    connect(eightBtn, SIGNAL(clicked()), this, SLOT(button_8_click()));
    connect(nineBtn, SIGNAL(clicked()), this, SLOT(button_9_click()));
    connect(zeroBtn, SIGNAL(clicked()), this, SLOT(button_0_click()));

    connect(addBtn, SIGNAL(clicked()), this, SLOT(button_add_click()));
    connect(subBtn, SIGNAL(clicked()), this, SLOT(button_sub_click()));
    connect(mulBtn, SIGNAL(clicked()), this, SLOT(button_mul_click()));
    connect(divideBtn, SIGNAL(clicked()), this, SLOT(button_divide_click()));
    connect(isBtn, SIGNAL(clicked()), this, SLOT(button_is_click()));
    connect(signBtn, SIGNAL(clicked()), this, SLOT(button_sign_click()));

    connect(clearBtn, SIGNAL(clicked()), this, SLOT(button_cls_click()));
    connect(ceBtn, SIGNAL(clicked()), this, SLOT(button_ce_click()));
    connect(backBtn, SIGNAL(clicked()), this, SLOT(button_back_click()));
    connect(pointBtn, SIGNAL(clicked()), this, SLOT(button_point_click()));

    centerWindow->setLayout(mainLayout);
}

MainWindow::~MainWindow()
{

}

/*
 **创建菜单栏选项
 */
void MainWindow::creatAction()
{
    standerAction = new QAction("&标准",this);
    standerAction->setShortcut(tr("Alt+1"));       //设置快捷键
    standerAction->setStatusTip("标准计算器");       //设置状态栏

    scienceAction = new QAction("&科学",this);
    scienceAction->setShortcut(tr("Alt+2"));
    scienceAction->setStatusTip("科学计算器");

    historyAction = new QAction("&历史记录",this);
    historyAction->setShortcut(tr("Alt+3"));
    historyAction->setStatusTip("历史记录");

    dateAction = new QAction("&日期计算",this);
    dateAction->setShortcut(tr("Alt+4"));
    dateAction->setStatusTip("日期计算");

    copyAction = new QAction("&复制",this);
    copyAction->setShortcut(tr("Ctrl+C"));
    copyAction->setStatusTip("复制结果");
    connect(copyAction, SIGNAL(triggered()), this, SLOT(copyResult()));

    pasteAction = new QAction("&粘贴",this);
    pasteAction->setShortcut(tr("Ctrl+V"));
    pasteAction->setStatusTip("粘贴");
    connect(pasteAction, SIGNAL(triggered()), this, SLOT(pasteNumber()));

    helpAction = new QAction("&查看帮助",this);
    helpAction->setShortcut(tr("F1"));
    helpAction->setStatusTip("查看帮助");
    connect(helpAction, SIGNAL(triggered()), this, SLOT(helpMessageBox()));

    aboutAction = new QAction("&关于",this);
    aboutAction->setShortcut(tr("F2"));
    aboutAction->setStatusTip("关于");
    connect(aboutAction, SIGNAL(triggered()), this, SLOT(aboutMessageBox()));

}

/*
 **创建菜单栏
 */
void MainWindow::creatMenu()
{
    //选择菜单
    chooseMenu=menuBar()->addMenu("&选择(C)");
    chooseMenu->addAction(standerAction);       //添加按钮
    chooseMenu->addAction(scienceAction);
    chooseMenu->addSeparator();                 //添加横线
    chooseMenu->addAction(historyAction);
    chooseMenu->addAction(dateAction);

    //编辑菜单
    editMenu=menuBar()->addMenu("&编辑(E)");
    editMenu->addAction(copyAction);
    editMenu->addAction(pasteAction);

    //帮助菜单
    helpMenu=menuBar()->addMenu("&帮助(H)");
    helpMenu->addAction(helpAction);
    helpMenu->addSeparator();
    helpMenu->addAction(aboutAction);
}

/*
** 使用消息盒子创建关于窗口
*/
void MainWindow::aboutMessageBox()
{
    QMessageBox::about(NULL, "关于", "计算器 V1.0 \r\n 2015.07.26");
}

void MainWindow::helpMessageBox()
{
    QMessageBox::about(NULL, "帮助", "这儿没有任何帮助!");
}

void MainWindow::copyResult()
{
    QClipboard *copy = QGuiApplication::clipboard();    //剪贴板操作
    temp = QString::number(result);
    copy->setText(temp);                    //复制到剪切板
}

void MainWindow::pasteNumber()
{
    QClipboard *paste = QGuiApplication::clipboard();
    temp = paste->text();
    showTextEdit->setText(temp);            //粘贴到剪切板
}

/*
**按下按钮后存入temp并在label上显示
*/
void MainWindow::button_1_click()
{
    temp += "1";
    showTextEdit->setText(temp);
}

void MainWindow::button_2_click()
{
    temp += "2";
    showTextEdit->setText(temp);
}

void MainWindow::button_3_click()
{
    temp += "3";
    showTextEdit->setText(temp);
}

void MainWindow::button_4_click()
{
    temp += "4";
    showTextEdit->setText(temp);
}

void MainWindow::button_5_click()
{
    temp += "5";
    showTextEdit->setText(temp);
}

void MainWindow::button_6_click()
{
    temp += "6";
    showTextEdit->setText(temp);
}

void MainWindow::button_7_click()
{
    temp += "7";
    showTextEdit->setText(temp);
}

void MainWindow::button_8_click()
{
    temp += "8";
    showTextEdit->setText(temp);
}

void MainWindow::button_9_click()
{
    temp += "9";
    showTextEdit->setText(temp);
}

void MainWindow::button_0_click()
{
    bool ok;
    double tem = temp.toDouble(&ok);

    //无用的0不能输入
    if(1 == temp.contains(".") || 0 != tem || NULL == temp)
    {
        temp += "0";
    }
    showTextEdit->setText(temp);
}

void MainWindow::button_add_click()
{
    if(false == num2)
    {
        num2 = true;
    }

    operation();
    operator1 = 1;          //operator1用来存储运算符
    showTextEdit->setText("+");
}

void MainWindow::button_sub_click()
{

    if(false == num2)
    {
        num2 = true;
    }

    operation();
    operator1 = 2;
    showTextEdit->setText("-");
}

void MainWindow::button_mul_click()
{
    if(false == num2)
    {
        num2 = true;
    }

    operation();
    operator1 = 3;
    showTextEdit->setText("*");
}

void MainWindow::button_divide_click()
{
    if(false == num2)
    {
        num2 = true;
    }

    operation();
    operator1 = 4;
    showTextEdit->setText("/");
}

void MainWindow::operation()
{
    bool ok;
    if(NULL == temp)
    {
        number = 0;
    }
    else
    {
        number = temp.toDouble(&ok);
    }

    //通过operator1选择相应的运算
    switch(operator1)
    {
    case 0:result = number;break;
    case 1:result += number;break;
    case 2:result -= number;break;
    case 3:result *= number;break;
    case 4:
        if(number == 0)
        {
            flag = true;
            break;
        }
        result /= number;
        break;
    default:
        break;
    }
    temp = "";
}

void MainWindow::button_is_click()
{
    bool ok;

    //单个数字,无运算结果
    if(num2 == false)
    {
        number = temp.toDouble(&ok);
        QString str1 = QString::number(number);
        resultTextEdit->setText(str1);
        return;
    }
    operation();

    num2 = false;
    operator1 = 0;

    if(true == flag)
    {
        resultTextEdit->setText("分母不能为0");
        return;
    }
    temp = QString::number(result);         //double转qstring
    resultTextEdit->setText(temp);
}

void MainWindow::button_cls_click()
{
    temp = "";
    number = 0;
    operator1 = 0;
    result = 0;
    showTextEdit->setText(temp);
    resultTextEdit->setText(temp);
}

void MainWindow::button_ce_click()
{
    temp = "";
    showTextEdit->setText(temp);
}

void MainWindow::button_back_click()
{
    temp.chop(1);                           //chop从字符串末尾删除1个字符
    showTextEdit->setText(temp);
}

void MainWindow::button_point_click()
{
    if(0 == temp.contains("."))
    {
        temp += ".";
    }
    showTextEdit->setText(temp);
}

void MainWindow::button_sign_click()
{
    //判断是否位负数
    if(temp.startsWith("-"))
    {
        temp = temp.mid(1);
        showTextEdit->setText(temp);
        return;
    }
    temp = temp.insert(0, "-");
    showTextEdit->setText(temp);
}

void MainWindow::keyPressEvent(QKeyEvent *k)
{
    //int b = k->key();
    switch(k->key())
    {
    case Qt::Key_0:button_0_click();break;
    case Qt::Key_1:button_1_click();break;
    case Qt::Key_2:button_2_click();break;
    case Qt::Key_3:button_3_click();break;
    case Qt::Key_4:button_4_click();break;
    case Qt::Key_5:button_5_click();break;
    case Qt::Key_6:button_6_click();break;
    case Qt::Key_7:button_7_click();break;
    case Qt::Key_8:button_8_click();break;
    case Qt::Key_9:button_9_click();break;
    case Qt::Key_Plus:button_add_click();break;         // +
    case Qt::Key_Minus:button_sub_click();break;        // -
    case Qt::Key_Asterisk:button_mul_click();break;     // *
    case Qt::Key_Slash:button_divide_click();break;     // /
    case Qt::Key_Backspace:button_back_click();break;   // ←
    case Qt::Key_Enter:button_is_click();break;         // =
    case Qt::Key_Period:button_point_click();break;     // .
    default:break;
    }
}
           

main.cpp:

#include "calcMainWindow.h"      
#include <QApplication>      
int main(int argc, char *argv[])      
{      
QApplication a(argc, argv);      
MainWindow w;      
w.setWindowTitle("灰熊问题的最优解");      
w.show();      
return a.exec();      
}      

转载请注明出处,新浪博客:灰熊问题的最优解