基于Qt實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器
在這篇技術(shù)博客中,我們將介紹如何使用Qt框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)算器應(yīng)用。我們將使用C++編程語(yǔ)言和Qt的圖形用戶(hù)界面庫(kù)來(lái)開(kāi)發(fā)這個(gè)應(yīng)用,并展示如何實(shí)現(xiàn)基本的算術(shù)操作。
項(xiàng)目設(shè)置
首先,我們需要在Qt Creator中創(chuàng)建一個(gè)新的Qt Widgets應(yīng)用程序項(xiàng)目。這個(gè)項(xiàng)目將提供我們所需的基本框架和文件結(jié)構(gòu)。在創(chuàng)建項(xiàng)目時(shí),我們可以選擇包含所需的文件和模板代碼,以便更快地開(kāi)始工作。
選擇 Qt Widegets Application
然后給項(xiàng)目命名
然后
后面的選擇QWidget
最后一步默認(rèn)就行了
界面設(shè)計(jì)
我們的計(jì)算器應(yīng)用將包含一個(gè)文本框用于顯示輸入和結(jié)果,以及一組按鈕用于輸入數(shù)字和執(zhí)行算術(shù)操作。我們可以使用Qt的界面設(shè)計(jì)器來(lái)設(shè)計(jì)和布局這些UI元素。界面設(shè)計(jì)器幫助我們以圖形方式布局和排列部件,并為它們添加適當(dāng)?shù)牟僮骱托盘?hào)槽連接。
在我們的計(jì)算器界面中,我們需要添加一個(gè)單行文本框(QLineEdit)用于顯示輸入和結(jié)果。此外,我們將添加數(shù)字按鈕(QPushButton)和操作按鈕(如加法、減法、乘法、除法和等于號(hào)按鈕)。通過(guò)在界面設(shè)計(jì)器中拖放這些元素,我們可以輕松地設(shè)置它們的位置和大小。
將界面設(shè)計(jì)成我這樣,上面白色展示計(jì)算的地方可以用 lineEdit , 剩下的用PushButton 就行了。
然后快捷的可以鼠標(biāo)右擊,打開(kāi)轉(zhuǎn)接到槽
選擇第一個(gè)clicked()
這樣在widegt.h ,widegt.cpp都有了寫(xiě)好的槽,我們只需要實(shí)先就可以了
事件處理
在widegt.h中聲明第一個(gè)實(shí)現(xiàn)算式運(yùn)算的數(shù)a和第二個(gè)實(shí)現(xiàn)算術(shù)運(yùn)算的數(shù)b
QString a; QStringList b; QString c;
widget.h完整代碼
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QString> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); QString a; QStringList b; QString c; private slots: void on_pushButton_1_clicked(); void on_pushButton_2_clicked(); void on_pushButton_3_clicked(); void on_pushButton_4_clicked(); void on_pushButton_5_clicked(); void on_pushButton_6_clicked(); void on_pushButton_7_clicked(); void on_pushButton_8_clicked(); void on_pushButton_9_clicked(); void on_pushButton_0_clicked(); void on_pushButton_add_clicked(); void on_pushButton_equit_clicked(); void on_pushButton_Sub_clicked(); void on_pushButton_Mult_clicked(); void on_pushButton_divi_clicked(); void on_pushButton_clear_clicked(); private: Ui::Widget *ui; }; #endif // WIDGET_H
widget.cpp中這樣寫(xiě)
一旦我們的界面布局完成,我們需要處理按鈕的點(diǎn)擊事件和執(zhí)行相應(yīng)的操作。為此,我們將使用Qt框架提供的信號(hào)和槽機(jī)制來(lái)連接按鈕的點(diǎn)擊事件和我們實(shí)現(xiàn)的槽函數(shù)。
對(duì)于數(shù)字按鈕,我們將在其點(diǎn)擊事件觸發(fā)時(shí)將相應(yīng)的數(shù)字追加到輸入字符串中,并更新文本框的顯示。例如,當(dāng)點(diǎn)擊數(shù)字按鈕"1"時(shí),我們將在輸入字符串末尾追加"1"并更新文本框。
對(duì)于操作按鈕(如加法、減法、乘法、除法和等于號(hào)按鈕),我們將執(zhí)行相應(yīng)的數(shù)學(xué)運(yùn)算并更新文本框的顯示。例如,當(dāng)點(diǎn)擊加法按鈕時(shí),我們將將當(dāng)前輸入字符串保存為第一個(gè)操作數(shù),清空輸入字符串,并在操作字符串中指定加法操作。
在等于號(hào)按鈕的點(diǎn)擊事件中,我們將解析操作字符串,并根據(jù)指定的操作類(lèi)型執(zhí)行相應(yīng)的數(shù)學(xué)運(yùn)算。我們完成計(jì)算后,將結(jié)果更新到輸入字符串中,并清空操作字符串,以便進(jìn)行下一次計(jì)算。
void Widget::on_pushButton_1_clicked() { a += "1"; // 將 '1' 添加到字符串 'a' ui->lineEdit->setText(a); // 將字符串 'a' 的內(nèi)容設(shè)置為文本框的文本 } void Widget::on_pushButton_2_clicked() { a += "2"; // 將 '2' 添加到字符串 'a' ui->lineEdit->setText(a); // 將字符串 'a' 的內(nèi)容設(shè)置為文本框的文本 } void Widget::on_pushButton_3_clicked() { a += "3"; // 將 '3' 添加到字符串 'a' ui->lineEdit->setText(a); // 將字符串 'a' 的內(nèi)容設(shè)置為文本框的文本 } void Widget::on_pushButton_4_clicked() { a += "4"; // 將 '4' 添加到字符串 'a' ui->lineEdit->setText(a); // 將字符串 'a' 的內(nèi)容設(shè)置為文本框的文本 } void Widget::on_pushButton_5_clicked() { a += "5"; // 將 '5' 添加到字符串 'a' ui->lineEdit->setText(a); // 將字符串 'a' 的內(nèi)容設(shè)置為文本框的文本 } void Widget::on_pushButton_6_clicked() { a += "6"; // 將 '6' 添加到字符串 'a' ui->lineEdit->setText(a); // 將字符串 'a' 的內(nèi)容設(shè)置為文本框的文本 } void Widget::on_pushButton_7_clicked() { a += "7"; // 將 '7' 添加到字符串 'a' ui->lineEdit->setText(a); // 將字符串 'a' 的內(nèi)容設(shè)置為文本框的文本 } void Widget::on_pushButton_8_clicked() { a += "8"; // 將 '8' 添加到字符串 'a' ui->lineEdit->setText(a); // 將字符串 'a' 的內(nèi)容設(shè)置為文本框的文本 } void Widget::on_pushButton_9_clicked() { a += "9"; // 將 '9' 添加到字符串 'a' ui->lineEdit->setText(a); // 將字符串 'a' 的內(nèi)容設(shè)置為文本框的文本 } void Widget::on_pushButton_0_clicked() { a += "0"; // 將 '0' 添加到字符串 'a' ui->lineEdit->setText(a); // 將字符串 'a' 的內(nèi)容設(shè)置為文本框的文本 }
代碼實(shí)現(xiàn)
在Qt Creator中,我們可以打開(kāi)所生成的模板代碼文件并開(kāi)始實(shí)現(xiàn)我們的計(jì)算器邏輯。在這里,我們將使用C++編程語(yǔ)言編寫(xiě)我們的槽函數(shù)和其他輔助函數(shù)。
在我們的Widget類(lèi)中,我們將定義一個(gè)私有變量a和b作為輸入和操作字符串。我們還將在Widget的構(gòu)造函數(shù)中連接按鈕的點(diǎn)擊事件和槽函數(shù),并在析構(gòu)函數(shù)中清理資源。
對(duì)于數(shù)字按鈕的槽函數(shù),我們將在當(dāng)前輸入字符串末尾追加相應(yīng)的數(shù)字,并更新文本框的顯示。
對(duì)于操作按鈕的槽函數(shù),我們將執(zhí)行以下步驟:
- 將當(dāng)前輸入字符串保存為第一個(gè)操作數(shù)。
- 清空輸入字符串。
- 在操作字符串中指定相應(yīng)的操作。
對(duì)于等于號(hào)按鈕的槽函數(shù),我們將執(zhí)行以下步驟:
- 將當(dāng)前輸入字符串保存為第二個(gè)操作數(shù)。
- 解析操作字符串,執(zhí)行相應(yīng)的數(shù)學(xué)運(yùn)算。
- 將計(jì)算結(jié)果更新到輸入字符串中,并清空操作字符串。
在清除按鈕的槽函數(shù)中,我們將清空輸入和操作字符串,并將文本框的顯示重置為"0"。
代碼實(shí)現(xiàn)
// 加法按鈕被點(diǎn)擊 void Widget::on_pushButton_add_clicked() { b.insert(0,a); // 將字符串a(chǎn)插入到字符串b的首位 a.clear(); // 清空字符串a(chǎn) b.insert(1,"+"); // 在字符串b的第1個(gè)位置插入"+"符號(hào) ui->lineEdit->setText(a); // 將字符串a(chǎn)的內(nèi)容設(shè)置為文本框的文本 } // 等于按鈕被點(diǎn)擊 void Widget::on_pushButton_equit_clicked() { if (!a.isEmpty() && !b.isEmpty()) { b.insert(2, a); // 在字符串b的第2個(gè)位置插入字符串a(chǎn) int v3; if (b.at(1) == "+") { // 判斷字符串b的第1個(gè)元素是否為"+" v3 = QString(b.at(0)).toInt() + QString(b.at(2)).toInt(); // 將字符串b的第0個(gè)和第2個(gè)元素轉(zhuǎn)換為整數(shù),并進(jìn)行加法運(yùn)算 ui->lineEdit->setText(QString::number(v3)); // 將結(jié)果轉(zhuǎn)換為字符串,并將其設(shè)置為文本框的文本 } else if (b.at(1) == "-") { // 判斷字符串b的第1個(gè)元素是否為"-" v3 = QString(b.at(0)).toInt() - QString(b.at(2)).toInt(); // 將字符串b的第0個(gè)和第2個(gè)元素轉(zhuǎn)換為整數(shù),并進(jìn)行減法運(yùn)算 ui->lineEdit->setText(QString::number(v3)); // 將結(jié)果轉(zhuǎn)換為字符串,并將其設(shè)置為文本框的文本 } else if (b.at(1) == "*") { // 判斷字符串b的第1個(gè)元素是否為"*" v3 = QString(b.at(0)).toInt() * QString(b.at(2)).toInt(); // 將字符串b的第0個(gè)和第2個(gè)元素轉(zhuǎn)換為整數(shù),并進(jìn)行乘法運(yùn)算 ui->lineEdit->setText(QString::number(v3)); // 將結(jié)果轉(zhuǎn)換為字符串,并將其設(shè)置為文本框的文本 } else if (b.at(1) == "/") { // 判斷字符串b的第1個(gè)元素是否為"/" v3 = QString(b.at(0)).toInt() / QString(b.at(2)).toInt(); // 將字符串b的第0個(gè)和第2個(gè)元素轉(zhuǎn)換為整數(shù),并進(jìn)行除法運(yùn)算 ui->lineEdit->setText(QString::number(v3)); // 將結(jié)果轉(zhuǎn)換為字符串,并將其設(shè)置為文本框的文本 } // 清空a和b,同時(shí)將結(jié)果保存到a,以便后續(xù)計(jì)算 a = QString::number(v3); b.clear(); } else { b.insert(0, a); // 將字符串a(chǎn)插入到字符串b的首位 a.clear(); // 清空字符串a(chǎn) } } // 減法按鈕被點(diǎn)擊 void Widget::on_pushButton_Sub_clicked() { b.insert(0,a); // 將字符串a(chǎn)插入到字符串b的首位 a.clear(); // 清空字符串a(chǎn) b.insert(1,"-"); // 在字符串b的第1個(gè)位置插入"-"符號(hào) ui->lineEdit->setText(a); // 將字符串a(chǎn)的內(nèi)容設(shè)置為文本框的文本 } // 乘法按鈕被點(diǎn)擊 void Widget::on_pushButton_Mult_clicked() { b.insert(0,a); // 將字符串a(chǎn)插入到字符串b的首位 a.clear(); // 清空字符串a(chǎn) b.insert(1,"*"); // 在字符串b的第1個(gè)位置插入"*"符號(hào) ui->lineEdit->setText(a); // 將字符串a(chǎn)的內(nèi)容設(shè)置為文本框的文本 } // 除法按鈕被點(diǎn)擊 void Widget::on_pushButton_divi_clicked() { b.insert(0,a); // 將字符串a(chǎn)插入到字符串b的首位 a.clear(); // 清空字符串a(chǎn) b.insert(1,"/"); // 在字符串b的第1個(gè)位置插入"/"符號(hào) ui->lineEdit->setText(a); // 將字符串a(chǎn)的內(nèi)容設(shè)置為文本框的文本 } // 清除鍵按鈕被點(diǎn)擊 void Widget::on_pushButton_clear_clicked() { a.clear(); // 清空字符串a(chǎn) b.clear(); // 清空字符串b ui->lineEdit->setText("0"); // 將文本框的文本設(shè)置為"0" }
結(jié)論
通過(guò)使用Qt框架和C++編程語(yǔ)言,我們成功地實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的計(jì)算器應(yīng)用。我們通過(guò)界面設(shè)計(jì)器設(shè)計(jì)了應(yīng)用的用戶(hù)界面,并使用槽函數(shù)和信號(hào)槽機(jī)制處理用戶(hù)的輸入和操作。這個(gè)計(jì)算器應(yīng)用可以執(zhí)行基本的數(shù)學(xué)運(yùn)算,并在文本框中顯示結(jié)果。
借助Qt的強(qiáng)大功能和易用性,我們可以進(jìn)一步擴(kuò)展和改進(jìn)這個(gè)計(jì)算器應(yīng)用,添加更多的功能和操作。我們可以使用Qt提供的其他庫(kù)和工具來(lái)增加應(yīng)用的性能和可視化效果。最終,這個(gè)計(jì)算器還有很多不完善的地方如果想修改完完善可以自己試試,這是一個(gè)非常簡(jiǎn)單的Qt項(xiàng)目,只適合初學(xué)者鍛煉。
到此這篇關(guān)于基于Qt實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器的文章就介紹到這了,更多相關(guān)Qt計(jì)算器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03C++輕松實(shí)現(xiàn)字符串與字符數(shù)組的相互轉(zhuǎn)換
本文詳細(xì)介紹了如何在C++中通過(guò)c_str()和strcpy()函數(shù)將字符串轉(zhuǎn)換為字符數(shù)組,以及使用for循環(huán)、+運(yùn)算符、重載=和內(nèi)置構(gòu)造函數(shù)將字符數(shù)組轉(zhuǎn)換為字符串的方法,需要的朋友可以參考下2025-03-03C語(yǔ)言實(shí)現(xiàn)個(gè)人財(cái)務(wù)管理
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)個(gè)人財(cái)務(wù)管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11解決codeblocks斷點(diǎn)不停無(wú)效的問(wèn)題
今天小編就為大家分享一篇解決codeblocks斷點(diǎn)不停無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Visual Studio 2019配置OpenCV4.1.1詳細(xì)圖解教程
這篇文章主要介紹了Visual Studio 2019配置OpenCV4.1.1詳細(xì)圖解教程 ,需要的朋友可以參考下2020-02-02簡(jiǎn)述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制
這篇文章主要介紹了簡(jiǎn)述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-08-08C語(yǔ)言實(shí)現(xiàn)opencv提取直線、輪廓及ROI實(shí)例詳解
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)opencv提取直線、輪廓及ROI實(shí)例詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01C語(yǔ)言?分析逆序字符串與字符串的逆序輸出有什么區(qū)別
例如,給定一個(gè)字符串?s,將?s?中的字符順序顛倒過(guò)來(lái),如?s?=?“abcd”,逆序后變成?“dcba”。可以采用多種方法對(duì)字符串進(jìn)行逆序,以下將對(duì)其中的方法和字符串的逆序輸出的區(qū)別進(jìn)行分析2022-04-04