實現簡單的計算器(控制器代碼)


設計原理:

1、在運算操作符前的數據,作為第一操作數,存在用於計算的對象——new execute()的num1屬性

2、點擊操作符時,將操作符存在用於計算的對象——new execute()的flag屬性

3、點擊等號的時候,將等號前的數據作為第二操作數,存在計算的對象——new execute()的num2屬性

同時,連續點擊數字鍵時,利用一個字符串連接連續點擊讀到的數字鍵上的數字,lable控件顯式。

細節:

每個按鈕都需要響應點擊事件,需要建立信號與槽函數。

 1 Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
 2 {
 3     ui->setupUi(this);
 4 
 5     this->res = "";
 6     this->exe = new execute();
 7 
 8     connect(this->ui->btn_0,SIGNAL(clicked()),this,SLOT(my_btn_0()));
 9     connect(this->ui->btn_1,SIGNAL(clicked()),this,SLOT(my_btn_1()));
10     connect(this->ui->btn_2,SIGNAL(clicked()),this,SLOT(my_btn_2()));
11     connect(this->ui->btn_3,SIGNAL(clicked()),this,SLOT(my_btn_3()));
12     connect(this->ui->btn_4,SIGNAL(clicked()),this,SLOT(my_btn_4()));
13     connect(this->ui->btn_5,SIGNAL(clicked()),this,SLOT(my_btn_5()));
14     connect(this->ui->btn_6,SIGNAL(clicked()),this,SLOT(my_btn_6()));
15     connect(this->ui->btn_7,SIGNAL(clicked()),this,SLOT(my_btn_7()));
16     connect(this->ui->btn_8,SIGNAL(clicked()),this,SLOT(my_btn_8()));
17     connect(this->ui->btn_9,SIGNAL(clicked()),this,SLOT(my_btn_9()));
18     connect(this->ui->btn_c,SIGNAL(clicked()),this,SLOT(my_btn_c()));
19     connect(this->ui->btn_eq,SIGNAL(clicked()),this,SLOT(my_btn_eq()));
20     connect(this->ui->btn_mult,SIGNAL(clicked()),this,SLOT(my_btn_mult()));
21     connect(this->ui->btn_dec,SIGNAL(clicked()),this,SLOT(my_btn_dec()));
22     connect(this->ui->btn_div,SIGNAL(clicked()),this,SLOT(my_btn_div()));
23     connect(this->ui->btn_add,SIGNAL(clicked()),this,SLOT(my_btn_add()));
24 }

數字按鈕的槽函數

功能:讀取按鈕數字,拼接成字符串,顯式在label控件

 1 void Dialog::my_btn_0(){
 2     //獲取到按鈕上的值,存儲在text屬性中
 3     res += this->ui->btn_0->text();
 4     //顯式到控件中
 5     if(res != "")  //避免顯式:000000的情況
 6         this->ui->lab_display->setText(res);
 7 }
 8 void Dialog::my_btn_1(){
 9     res += this->ui->btn_1->text();
10     this->ui->lab_display->setText(res);
11 }
12 void Dialog::my_btn_2(){
13     res += this->ui->btn_2->text();
14     this->ui->lab_display->setText(res);
15 }
16 void Dialog::my_btn_3(){
17     res += this->ui->btn_3->text();
18     this->ui->lab_display->setText(res);
19 }
20 void Dialog::my_btn_4(){
21     res += this->ui->btn_4->text();
22     this->ui->lab_display->setText(res);
23 }
24 void Dialog::my_btn_5(){
25     res += this->ui->btn_5->text();
26     this->ui->lab_display->setText(res);
27 }
28 void Dialog::my_btn_6(){
29     res += this->ui->btn_6->text();
30     this->ui->lab_display->setText(res);
31 }
32 void Dialog::my_btn_7(){
33     res += this->ui->btn_7->text();
34     this->ui->lab_display->setText(res);
35 }
36 void Dialog::my_btn_8(){
37     res += this->ui->btn_8->text();
38     this->ui->lab_display->setText(res);
39 }
40 void Dialog::my_btn_9(){
41     res += this->ui->btn_9->text();
42     this->ui->lab_display->setText(res);
43 }

運算操作符:

功能:記錄之前所有的數字拼接成的字符串,轉為int類型的數據,存儲。記錄操作符

 1 void Dialog::my_btn_mult(){
 2     int num1 = this->res.toInt();
 3     this->exe->setnum1(num1);
 4     this->res = "";  //清除緩存器
 5     this->ui->lab_display->setText("0");  //實現更新
 6     this->exe->setflag(this->ui->btn_mult->text());  //記錄操作符
 7 }
 8 void Dialog::my_btn_dec(){
 9     int num1 = this->res.toInt();
10     this->exe->setnum1(num1);
11     this->res = "";
12     this->ui->lab_display->setText("0");
13     this->exe->setflag(this->ui->btn_dec->text());
14 }
15 void Dialog::my_btn_add(){
16     //獲取操作符之前的數據,作為第一個數據
17     int num1 = this->res.toInt();
18     this->exe->setnum1(num1);
19     this->res = "";
20     this->ui->lab_display->setText("0");
21     this->exe->setflag(this->ui->btn_add->text());
22 }
23 void Dialog::my_btn_div(){
24     int num1 = this->res.toInt();
25     this->exe->setnum1(num1);
26     this->res = "";
27     this->ui->lab_display->setText("0");
28     this->exe->setflag(this->ui->btn_div->text());
29 }

等號操作符槽函數:

功能:獲取第二操作數,存儲。然后開始計算

1 void Dialog::my_btn_eq(){
2     //獲取等號操作符之前的數據,作為數據2
3     int num2 = this->res.toInt();
4     this->exe->setnum2(num2);
5     this->res = "";
6     QString rst = this->exe->doexe();  //計算
7     this->ui->lab_display->setText(rst); //顯式計算值
8 }

 

-----------------------------------------------------------------------------------------------------------------------------------------------------

設計模式采用MVC模式,怎么關聯M與V的呢?

 1 #ifndef DIALOG_H
 2 #define DIALOG_H
 3 #include "execute.h"
 4 #include <QDialog>
 5 #include <QString>
 6 
 7 namespace Ui {
 8 class Dialog;
 9 }
10 
11 class Dialog : public QDialog
12 {
13     Q_OBJECT
14 
15 public:
16     explicit Dialog(QWidget *parent = nullptr);
17     ~Dialog();
18 
19 private slots:
20     void my_btn_0();
21     void my_btn_1();
22     void my_btn_2();
23     void my_btn_3();
24     void my_btn_4();
25     void my_btn_5();
26     void my_btn_6();
27     void my_btn_7();
28     void my_btn_8();
29     void my_btn_9();
30     void my_btn_c();
31     void my_btn_eq();
32     void my_btn_add();
33     void my_btn_dec();
34     void my_btn_mult();
35     void my_btn_div();
36 private:
37     QString res; //用來存放運算操作數
38     Ui::Dialog *ui;  //UI
39     execute* exe;    //計算功能,在這里讓MCV的 M和V關聯起來
40 };
41 
42 #endif // DIALOG_H

這樣在Dialog窗體(對象中),既可以從ui中獲取數據,然后用於計算execute,然后再傳入UI中進行顯式,所以在Dialog對象中,可以訪問execute對象,還可以訪問Ui::Dialog對象,即在這里定義為其數據成員。

  1 #include "dialog.h"
  2 #include "ui_dialog.h"
  3 
  4 Dialog::Dialog(QWidget *parent) :QDialog(parent),ui(new Ui::Dialog)
  5 {
  6     ui->setupUi(this);
  7 
  8     this->res = "";
  9     this->exe = new execute();
 10 
 11     connect(this->ui->btn_0,SIGNAL(clicked()),this,SLOT(my_btn_0()));
 12     connect(this->ui->btn_1,SIGNAL(clicked()),this,SLOT(my_btn_1()));
 13     connect(this->ui->btn_2,SIGNAL(clicked()),this,SLOT(my_btn_2()));
 14     connect(this->ui->btn_3,SIGNAL(clicked()),this,SLOT(my_btn_3()));
 15     connect(this->ui->btn_4,SIGNAL(clicked()),this,SLOT(my_btn_4()));
 16     connect(this->ui->btn_5,SIGNAL(clicked()),this,SLOT(my_btn_5()));
 17     connect(this->ui->btn_6,SIGNAL(clicked()),this,SLOT(my_btn_6()));
 18     connect(this->ui->btn_7,SIGNAL(clicked()),this,SLOT(my_btn_7()));
 19     connect(this->ui->btn_8,SIGNAL(clicked()),this,SLOT(my_btn_8()));
 20     connect(this->ui->btn_9,SIGNAL(clicked()),this,SLOT(my_btn_9()));
 21     connect(this->ui->btn_c,SIGNAL(clicked()),this,SLOT(my_btn_c()));
 22     connect(this->ui->btn_eq,SIGNAL(clicked()),this,SLOT(my_btn_eq()));
 23     connect(this->ui->btn_mult,SIGNAL(clicked()),this,SLOT(my_btn_mult()));
 24     connect(this->ui->btn_dec,SIGNAL(clicked()),this,SLOT(my_btn_dec()));
 25     connect(this->ui->btn_div,SIGNAL(clicked()),this,SLOT(my_btn_div()));
 26     connect(this->ui->btn_add,SIGNAL(clicked()),this,SLOT(my_btn_add()));
 27 }
 28 
 29 Dialog::~Dialog()
 30 {
 31     delete ui;
 32     delete exe;
 33 }
 34 
 35 void Dialog::my_btn_0(){
 36     //獲取到按鈕上的值,存儲在text屬性中
 37     res += this->ui->btn_0->text();
 38     //顯式到控件中
 39     if(res != "")  //避免顯式:000000的情況
 40         this->ui->lab_display->setText(res);
 41 }
 42 void Dialog::my_btn_1(){
 43     res += this->ui->btn_1->text();
 44     this->ui->lab_display->setText(res);
 45 }
 46 void Dialog::my_btn_2(){
 47     res += this->ui->btn_2->text();
 48     this->ui->lab_display->setText(res);
 49 }
 50 void Dialog::my_btn_3(){
 51     res += this->ui->btn_3->text();
 52     this->ui->lab_display->setText(res);
 53 }
 54 void Dialog::my_btn_4(){
 55     res += this->ui->btn_4->text();
 56     this->ui->lab_display->setText(res);
 57 }
 58 void Dialog::my_btn_5(){
 59     res += this->ui->btn_5->text();
 60     this->ui->lab_display->setText(res);
 61 }
 62 void Dialog::my_btn_6(){
 63     res += this->ui->btn_6->text();
 64     this->ui->lab_display->setText(res);
 65 }
 66 void Dialog::my_btn_7(){
 67     res += this->ui->btn_7->text();
 68     this->ui->lab_display->setText(res);
 69 }
 70 void Dialog::my_btn_8(){
 71     res += this->ui->btn_8->text();
 72     this->ui->lab_display->setText(res);
 73 }
 74 void Dialog::my_btn_9(){
 75     res += this->ui->btn_9->text();
 76     this->ui->lab_display->setText(res);
 77 }
 78 void Dialog::my_btn_c(){
 79     res ="";
 80     this->ui->lab_display->setText("0");
 81 }
 82 void Dialog::my_btn_eq(){
 83     //獲取等號操作符之前的數據,作為數據2
 84     int num2 = this->res.toInt();
 85     this->exe->setnum2(num2);
 86     this->res = "";
 87     QString rst = this->exe->doexe();
 88     this->ui->lab_display->setText(rst);
 89 }
 90 void Dialog::my_btn_mult(){
 91     int num1 = this->res.toInt();
 92     this->exe->setnum1(num1);
 93     this->res = "";
 94     this->ui->lab_display->setText("0");
 95     this->exe->setflag(this->ui->btn_mult->text());
 96 }
 97 void Dialog::my_btn_dec(){
 98     int num1 = this->res.toInt();
 99     this->exe->setnum1(num1);
100     this->res = "";
101     this->ui->lab_display->setText("0");
102     this->exe->setflag(this->ui->btn_dec->text());
103 }
104 void Dialog::my_btn_add(){
105     //獲取操作符之前的數據,作為第一個數據
106     int num1 = this->res.toInt();
107     this->exe->setnum1(num1);
108     this->res = "";
109     this->ui->lab_display->setText("0");
110     this->exe->setflag(this->ui->btn_add->text());
111 }
112 void Dialog::my_btn_div(){
113     int num1 = this->res.toInt();
114     this->exe->setnum1(num1);
115     this->res = "";
116     this->ui->lab_display->setText("0");
117     this->exe->setflag(this->ui->btn_div->text());
118 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM