Qt 是目前最先進、最完整的跨平臺C++開發工具。它不僅完全實現了一次編寫,所有平臺無差別運行,更提供了幾乎所有開發過程中需要用到的工具。如今,Qt已被運用於超過70個行業、數千家企業,支持數百萬設備及應用。
本文將展示如何使用信號和槽來實現計算器小部件的功能,以及如何使用QGridLayout在網格中放置子小部件。
這個例子由兩個類組成:
- 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),因爲÷的優先級高於+。
下表顯示了當用戶輸入數學表達式時計算器狀態的演變。
一元操作符,如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 主題!