設計原理:
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 }