您好,登錄后才能下訂單哦!
一.計算機程序界面分析
從效果圖我們可以得知
1.QLineEdit用于接受用戶輸入
2.QLineEdit能夠獲取用戶輸入的字符串
3.QLineEdit是功能性組件,需要父組件作為容器
4.QLineEdit能夠在父組件中進行定位
該計算器的坐標及位置如圖所示
界面的代碼實現
#include "Widget.h"
#include <QApplication>
#include <QPushButton>
#include <QLineEdit>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget* w = new QWidget(NULL, Qt::WindowCloseButtonHint);
w->setWindowTitle("Calculator");
QLineEdit* le = new QLineEdit(w);
QPushButton* button[20] = {0};
const char* btnText[20] =
{//數字鍵與功能鍵
"7", "8", "9", "+", "(",
"4", "5", "6", "-", ")",
"1", "2", "3", "*", "<-",
"0", ".", "=", "/", "C",
};
int ret = 0;
//設置的大小以及坐標
le->move(10, 10);
le->resize(240, 30);
le->setReadOnly(true);
//數字鍵與功能鍵的位置的實現
for(int i=0; i<4; i++)
{
for(int j=0; j<5; j++)
{
button[i*5 + j] = new QPushButton(w);
button[i*5 + j]->resize(40, 40);
button[i*5 + j]->move(10 + (10 + 40)*j, 50 + (10 + 40)*i);
button[i*5 + j]->setText(btnText[i*5 + j]);
}
}
w->show();
w->setFixedSize(w->width(), w->height());
ret = a.exec();
delete w;
return ret;
}
運行的結果如圖所示
上面只是暫時生成了計算機demo的UI,會存在許多的問題以及算法的實現按會在接下來進行介紹
A.計算器界面的代碼重構
1.重構--以改善代碼質量為目的代碼重寫,使其軟件設計的設計和架構更加合理,提高軟件的擴展性和維護性
代碼的實現與重構不同
代碼實現--按照設計編程實現,重心在于功能的實現
代碼重構--以提高代碼質量為目的軟件架構優化
區別:代碼實現是不考慮架構的好壞,只考慮功能的實現,代碼重構時不能影響已實現的功能,只考慮架構的改善
計算器界面代碼重構
重構的實現
main.cpp
#include "CalculatorUI.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QCalculatorUI* cal = QCalculatorUI::NewInstance();
int ret = -1;
if( cal != NULL )
{
cal->show();
ret = a.exec();
delete cal;
}
return ret;
}
CalculatorUI.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
class QCalculatorUI : public QWidget
{
private:
QLineEdit* m_edit;
QPushButton* m_buttons[20];
QCalculatorUI();
bool construct();
public:
static QCalculatorUI* NewInstance();
void show();
~QCalculatorUI();
};
#endif // WIDGET_H
CalculatorUI.cpp
#include "CalculatorUI.h"
QCalculatorUI::QCalculatorUI() : QWidget(NULL, Qt::WindowCloseButtonHint)
{
}
bool QCalculatorUI::construct()
{
bool ret = true;
const char* btnText[20] =
{
"7", "8", "9", "+", "(",
"4", "5", "6", "-", ")",
"1", "2", "3", "*", "<-",
"0", ".", "=", "/", "C",
};
m_edit = new QLineEdit(this);
if( m_edit != NULL )
{
m_edit->move(10, 10);
m_edit->resize(240, 30);
m_edit->setReadOnly(true);
}
else
{
ret = false;
}
for(int i=0; (i<4) && ret; i++)
{
for(int j=0; (j<5) && ret; j++)
{
m_buttons[i*5 + j] = new QPushButton(this);
if( m_buttons[i*5 + j] != NULL )
{
m_buttons[i*5 + j]->resize(40, 40);
m_buttons[i*5 + j]->move(10 + (10 + 40)*j, 50 + (10 + 40)*i);
m_buttons[i*5 + j]->setText(btnText[i*5 + j]);
}
else
{
ret = false;
}
}
}
return ret;
}
QCalculatorUI* QCalculatorUI::NewInstance()
{
QCalculatorUI* ret = new QCalculatorUI();
if( (ret == NULL) || !ret->construct() )
{
delete ret;
ret = NULL;
}
return ret;
}
void QCalculatorUI::show()
{
QWidget::show();
setFixedSize(width(), height());
}
QCalculatorUI::~QCalculatorUI()
{
}
代碼實現的結果
B.在這里要對Qt的消息處理做介紹,對之后計算器的操作會有幫助
1.Qt消息模型
Qt封裝了具體操作系統的消息機制
Qt遵循經典的GUI消息驅動事件模型
C.Qt定義了與系統消息相關的概念
a.信號--由操作系統產生的消息
b.槽--程序中的消息處理函數
c.連接--將系統消息綁定到消息處理函數
Qt的消息處理機制
上圖從Qt幫助文檔中對connect進行查找,connect函數包含了發送對象、消息名、接收對象、接收對象的的成員函數
D.自定義槽
1.只有QObject的子類才能自定義槽
2.定義槽的類必須在聲明的最開始處使用Q_OBJECT
3.類中聲明槽時需要使用slots關鍵字
4.槽與所處理的信號在函數簽名上必須一致
5.SIGNAL和SLOT所指定的名稱中可以包含參數類型,不能包含具體參數名
//在上面的Calculator.h上添加槽函數
private slots:
void onButtonClicked();
//同時在cpp上將其實現,通過connect函數將其相連
void QCalculatorUI::onButtonClicked()
{
QPushButton* btn = (QPushButton*)sender();
qDebug() << "onButtonClicked()";
qDebug() << btn->text();
}
connect(m_buttons[i*5 + j], SIGNAL(clicked(bool)), this, SLOT(onButtonClicked()));
按鈕按下實現的打印結果
E.計算器算法的實現
1.前綴表達式、中綴表達式、后綴表達式的區別
a.前綴表達式--前綴表達式是一種沒有括號的算術表達式,與中綴表達式不同的是,其將運算符寫在前面,操作數寫在后面。為紀念其發明者波蘭數學家Jan Lukasiewicz,前綴表達式也稱為“波蘭式”。例如,- 1 + 2 3,它等價于1-(2+3)。
b.中綴表達式--是一個通用的算術或邏輯公式表示方法, 操作符是以中綴形式處于操作數的中間(例:3 + 4),中綴表達式是人們常用的算術表示方法。與前綴表達式(例:+ 3 4)或后綴表達式(例:3 4 +)相比,中綴表達式不容易被計算機解析,但仍被許多程序語言使用,因為它符合人們的普遍用法。與前綴或后綴記法不同的是,中綴記法中括號是必需的。計算過程中必須用括號將操作符和對應的操作數括起來,用于指示運算的次序。
c.后綴表達式--后綴表達式,又稱逆波蘭式,指的是不包含括號,運算符放在兩個運算對象的后面,所有的計算按運算符出現的順序,嚴格從左向右進行(不再考慮運算符的優先規則)
計算器的算法實現
1.將中綴表達式進行數字和運算符的分離
2.將中綴表達式轉換為后綴表達式
3.通過后綴表達式計算最終結果
所有要計算的中綴表達式中包含
分離算法的實現--思想:以符號作為標志對表達式中的字符逐個訪問
中綴轉后綴
中綴表達式轉后綴表達式的過程類似編譯過程
1.四則運算表達式中的括號必須匹配
2.根據運算符優先級進行轉換
3.轉換后的表達式中沒有括號
4.轉換后可以順序的計算出最終結果
轉換過程的實現:a當前元素e為數字對其輸出;b當前元素e為運算符,先與棧頂運算符進行優先級比較,當其小于或者等于時將棧頂元素輸出,轉1,如果大于將棧頂元素e入棧;c當前元素e為左括號進行入棧;d當前元素e為右括號時彈出棧頂元素并輸出,直至棧頂元素為左括號,然后將棧頂的左括號從棧中彈出
合法的四則運算表達式中--括號匹配成對出現,左括號必然先于右括號出現
后綴表達式計算
遍歷后綴表達式中的數字和運算符--a當前元素為數字進棧;b當前元素為運算符先從棧中彈出右操作數,再從棧中彈出昨操作數;c根據符號進行運算;d將運算結果壓入棧中
最后附上完整的代碼下載鏈接https://down.51cto.com/data/2464399
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。