「Qt Widget中文示例指南」如何創建一個計算器?(一)

Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用於超過70個行業、數千家企業,支持數百萬設備及應用。

本文將展示如何使用信號和槽來實現計算器小部件的功能,以及如何使用QGridLayout在網格中放置子小部件。

Qt Widget中文示例指南圖集
計算器示例的屏幕截圖

這個例子由兩個類組成:

  • Calculator是計算器小部件,具有計算器的所有功能。
  • Button是用於每個計算器按鈕的小部件,它派生自QToolButton。

我們將從回顧計算器開始,然後再看看按鈕。

Calculator類定義

class Calculator : public QWidget
{
Q_OBJECT

public:
Calculator(QWidget *parent = nullptr);

private slots:
void digitClicked();
void unaryOperatorClicked();
void additiveOperatorClicked();
void multiplicativeOperatorClicked();
void equalClicked();
void pointClicked();
void changeSignClicked();
void backspaceClicked();
void clear();
void clearAll();
void clearMemory();
void readMemory();
void setMemory();
void addToMemory();

Calculator類提供了一個簡單的計算器小部件,它繼承自QDialog,並且有幾個與計算器按鈕相關聯的私有槽,重新實現了QObject::eventFilter()來處理計算器顯示的鼠標事件。

Buttons根據其操作進行分類。例如,所有數字按鈕(標記爲0到9)向當前操作數追加一個數字。對於這些,我們將多個按鈕連接到同一個插槽(例如,digitClicked())。類別包括數字、一元運算符(Sqrt、x²、1/x)、加法運算符(+、-)和乘法運算符(x、÷),其他按鈕都有自己的插槽。

private:
template<typename PointerToMemberFunction>
Button *createButton(const QString &text, const PointerToMemberFunction &member);
void abortOperation();
bool calculate(double rightOperand, const QString &pendingOperator);

私有的createButton()函數被用作小部件構造的一部分,abortOperation()在發生除零操作或對負數進行平方根操作時調用,Calculate()應用二進制運算符(+、-、x或÷)。

double sumInMemory;
double sumSoFar;
double factorSoFar;
QString pendingAdditiveOperator;
QString pendingMultiplicativeOperator;
bool waitingForOperand;

這些變量與計算器顯示的內容(QLineEdit)一起編碼計算器的狀態:

  • sumInMemory包含存儲在計算器內存中的值(使用MS、M+或MC)。
  • sumSoFar存儲到目前爲止累積的值,當用戶單擊=時,sumSoFar被重新計算並顯示在顯示器上,Clear All將sumSoFar重置爲零。
  • factorSoFar在進行乘法和除法運算時存儲一個臨時值。
  • pendingAdditiveOperator存儲用戶單擊的最後一個添加操作符。
  • pendingMultiplicativeOperator存儲用戶單擊的最後一個乘法運算符。
  • 當計算器期望用戶開始輸入操作數時,waitingForOperand爲true。

加法運算符和乘法運算符的處理方式不同,因爲它們具有不同的優先級。例如,1 + 2 ÷ 3被解釋爲1 + (2 ÷ 3),因爲÷的優先級高於+。

下表顯示了當用戶輸入數學表達式時計算器狀態的演變。

Qt Widget中文示例指南圖集

一元操作符,如Sqrt,不需要特殊處理;它們可以立即應用,因爲在單擊操作符按鈕時已經知道操作數。

QLineEdit *display;

enum { NumDigitButtons = 10 };
Button *digitButtons[NumDigitButtons];
};

最後,聲明與顯示和用於顯示數字的按鈕相關聯的變量。

Qt Widget組件推薦

  • QtitanRibbon - Ribbon UI組件:是一款遵循Microsoft Ribbon UI Paradigm for Qt技術的Ribbon UI組件,QtitanRibbon致力於爲Windows、Linux和Mac OS X提供功能完整的Ribbon組件。
  • QtitanChart - Qt類圖表組件:是一個C ++庫,代表一組控件,這些控件使您可以快速地爲應用程序提供漂亮而豐富的圖表。
  • QtitanDataGrid - Qt網格組件:提供了一套完整的標準 QTableView 函數和傳統組件無法實現的獨特功能。使您能夠將不同來源的各類數據加載到一個快速、靈活且功能強大的可編輯網格中,支持排序、分組、報告、創建帶狀列、拖放按鈕和許多其他方便的功能。
  • QtitanDocking:允許您像 Visual Studio 一樣爲您的偉大應用程序配備可停靠面板和可停靠工具欄。黑色、白色、藍色調色板完全支持 Visual Studio 2019 主題!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章