中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt--計算器的實現

發布時間:2020-07-06 18:32:03 來源:網絡 閱讀:2006 作者:淡淡_小孩 欄目:編程語言

一.計算機程序界面分析
Qt--計算器的實現
從效果圖我們可以得知
1.QLineEdit用于接受用戶輸入
2.QLineEdit能夠獲取用戶輸入的字符串
3.QLineEdit是功能性組件,需要父組件作為容器
4.QLineEdit能夠在父組件中進行定位
該計算器的坐標及位置如圖所示
Qt--計算器的實現
界面的代碼實現

#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;
}

運行的結果如圖所示
Qt--計算器的實現
上面只是暫時生成了計算機demo的UI,會存在許多的問題以及算法的實現按會在接下來進行介紹
A.計算器界面的代碼重構
1.重構--以改善代碼質量為目的代碼重寫,使其軟件設計的設計和架構更加合理,提高軟件的擴展性和維護性
代碼的實現與重構不同
代碼實現--按照設計編程實現,重心在于功能的實現
代碼重構--以提高代碼質量為目的軟件架構優化
區別:代碼實現是不考慮架構的好壞,只考慮功能的實現,代碼重構時不能影響已實現的功能,只考慮架構的改善
計算器界面代碼重構
Qt--計算器的實現
重構的實現

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()
{

}

代碼實現的結果
Qt--計算器的實現
B.在這里要對Qt的消息處理做介紹,對之后計算器的操作會有幫助
1.Qt消息模型

Qt封裝了具體操作系統的消息機制
Qt遵循經典的GUI消息驅動事件模型
Qt--計算器的實現
C.Qt定義了與系統消息相關的概念
a.信號--由操作系統產生的消息
b.--程序中的消息處理函數
c.連接--將系統消息綁定到消息處理函數
Qt的消息處理機制
Qt--計算器的實現
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()));

按鈕按下實現的打印結果
Qt--計算器的實現
E.計算器算法的實現
1.前綴表達式、中綴表達式、后綴表達式的區別
a.前綴表達式--前綴表達式是一種沒有括號的算術表達式,與中綴表達式不同的是,其將運算符寫在前面,操作數寫在后面。為紀念其發明者波蘭數學家Jan Lukasiewicz,前綴表達式也稱為“波蘭式”。例如,- 1 + 2 3,它等價于1-(2+3)。
b.中綴表達式--是一個通用的算術或邏輯公式表示方法, 操作符是以中綴形式處于操作數的中間(例:3 + 4),中綴表達式是人們常用的算術表示方法。與前綴表達式(例:+ 3 4)或后綴表達式(例:3 4 +)相比,中綴表達式不容易被計算機解析,但仍被許多程序語言使用,因為它符合人們的普遍用法。與前綴或后綴記法不同的是,中綴記法中括號是必需的。計算過程中必須用括號將操作符和對應的操作數括起來,用于指示運算的次序。
c.后綴表達式--后綴表達式,又稱逆波蘭式,指的是不包含括號,運算符放在兩個運算對象的后面,所有的計算按運算符出現的順序,嚴格從左向右進行(不再考慮運算符的優先規則)
計算器的算法實現
1.將中綴表達式進行數字和運算符的分離
2.將中綴表達式轉換為后綴表達式
3.通過后綴表達式計算最終結果

所有要計算的中綴表達式中包含
Qt--計算器的實現
分離算法的實現--思想:以符號作為標志對表達式中的字符逐個訪問
Qt--計算器的實現
Qt--計算器的實現
中綴轉后綴
中綴表達式轉后綴表達式的過程類似編譯過程
1.四則運算表達式中的括號必須匹配
2.根據運算符優先級進行轉換
3.轉換后的表達式中沒有括號
4.轉換后可以順序的計算出最終結果
轉換過程的實現:a當前元素e為數字對其輸出;b當前元素e為運算符,先與棧頂運算符進行優先級比較,當其小于或者等于時將棧頂元素輸出,轉1,如果大于將棧頂元素e入棧;c當前元素e為左括號進行入棧;d當前元素e為右括號時彈出棧頂元素并輸出,直至棧頂元素為左括號,然后將棧頂的左括號從棧中彈出
Qt--計算器的實現
合法的四則運算表達式中--括號匹配成對出現,左括號必然先于右括號出現
Qt--計算器的實現
后綴表達式計算
遍歷后綴表達式中的數字和運算符--a當前元素為數字進棧;b當前元素為運算符先從棧中彈出右操作數,再從棧中彈出昨操作數;c根據符號進行運算;d將運算結果壓入棧中
Qt--計算器的實現

最后附上完整的代碼下載鏈接https://down.51cto.com/data/2464399

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

河津市| 济宁市| 灯塔市| 泉州市| 沈阳市| 东乌珠穆沁旗| 定西市| 石门县| 澎湖县| 河源市| 务川| 梓潼县| 商水县| 乌拉特中旗| 定安县| 禄劝| 嵊州市| 双流县| 恩施市| 开平市| 玉林市| 封丘县| 新乡县| 新乡市| 宾川县| 深水埗区| 平定县| 拉孜县| 新营市| 砀山县| 建水县| 嘉兴市| 全州县| 乐至县| 南川市| 剑河县| 商南县| 浙江省| 临桂县| 都匀市| 盐亭县|