QT實現一個簡單的計算器
阿新 • • 發佈:2019-02-15
最近幾天在學習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();
}
轉載請註明出處,新浪部落格:灰熊問題的最優解