1. 程式人生 > >QT實現一個簡單的計算器

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>
intmain(intargc,char*argv[])
{
QApplicationa(argc,argv);
MainWindoww;
w.setWindowTitle("灰熊問題的最優解");
w.show();
returna.exec();
}

轉載請註明出處,新浪部落格:灰熊問題的最優解