背景
前面一節(jié)介紹了用Qt 設(shè)計計算器的界面,這節(jié)將總結(jié)一下如何讓界面可以運(yùn)行,如何設(shè)計計算器的功能部分。將從以下幾方面講述,計算器的文本編輯控件,可以發(fā)射字符的按鈕,以及負(fù)責(zé)處理計算和創(chuàng)建UI的計算器類。項目基于語言設(shè)計計算器,文件結(jié)構(gòu)如下。這里的結(jié)構(gòu)目錄只是一個虛擬的目錄,實(shí)際每個文件存放的位置需要自己規(guī)劃。
Ui文件編譯
.ui是之前設(shè)計的界面,程序運(yùn)行前ui會被編譯為.h。編譯的路徑和編譯后頭文件的名稱可以在項目屬性頁面Qt User 配置,如下。當(dāng)然ui頭文件也可以自己寫,不用Qt ,但這樣有點(diǎn)麻煩。
計算器文本編輯控件 .h
上一節(jié)已經(jīng)在界面中引用了類,這個類需要有一些特定的信號與槽函數(shù)。具體功能應(yīng)該有接受并顯示按鈕的字符,后退按鈕,清除按鈕,開始執(zhí)行計算按鈕。還需要發(fā)送用戶輸入到計算器類來完成計算,隨后接受并顯示結(jié)果。完成頭文件時,需要注意文件名,類名,信號槽函數(shù)名稱與界面設(shè)計時的名稱一致。類繼承自,如果對象構(gòu)造函數(shù)接收到了一個父控件,這個對象會自動在適當(dāng)?shù)臅r候被析構(gòu),大家可以去官網(wǎng)學(xué)習(xí)下Qt的自動內(nèi)存管理。這里沒有分配內(nèi)存c語言制作簡單計算器,所以不用寫析構(gòu)函數(shù),使用默認(rèn)析構(gòu)即可。這個聲明是個宏定義,有了這個聲明c語言設(shè)計計算器,這個類就可以使用/slot。
#
#define CALCULATORTEXT_H
#include
class calculatortext : public QTextEdit {
Q_OBJECT;
public:
calculatortext(QWidget* parent);
public slots:
void input(char);
void showresult(QString);
void back();
void cleartext();
void equal();
signals:
void sendtext(QString);
private:

QString inputtext;
QString resulttext;
QVector checkstack;
};
#endif //CALCULATORTEXT_H
復(fù)制
這是cpp文件,函數(shù)寫的有些笨重,大家如果有更好的方法可以替換掉。equal()槽函數(shù)發(fā)射了一個信號,這個信號將送往計算器類來處理。
# ".h"
calculatortext::calculatortext(QWidget* parent) :
QTextEdit(parent)
{
}
void calculatortext::input(char symbol) {
inputtext += symbol;
setFontPointSize(22);
setTextColor(QColor(0, 0, 255));
setText(inputtext + '\n' + resulttext);
//setFontPointSize(22);
//setTextColor(QColor(0,0,255));
}
void calculatortext::showresult(QString result) {

resulttext = result;
setText(inputtext + '\n' + resulttext);
setFontPointSize(22);
setTextColor(QColor(0, 0, 255));
}
void calculatortext::back() {
inputtext = inputtext.remove(inputtext.size() - 1, 1);
setText(inputtext + '\n' + resulttext);
setFontPointSize(22);
setTextColor(QColor(0, 0, 255));
}
void calculatortext::cleartext() {
inputtext.clear();
resulttext.clear();
setText(QString("0\n0"));
setFontPointSize(22);
setTextColor(QColor(0, 0, 255));
}
void calculatortext::equal() {
emit sendtext(inputtext);
復(fù)制
可以發(fā)射字符的計算器按鈕 .h
按鈕的功能就很簡單了,只需要按下時發(fā)射一個字符。把的()信號換綁為新的可以發(fā)射字符的信號即可。
#
#define CALCULATORBUTTON_H
#include
class calculatorbutton : public QPushButton {
Q_OBJECT;
public:
calculatorbutton(QWidget* parent);
public slots:
void sendchar();
signals:
void click(char);
};
復(fù)制
cpp文件中需要定義一下構(gòu)造函數(shù)c語言制作簡單計算器,因?yàn)橐獙⒌?)與()綁定。按鈕的中的信號click(char)在界面設(shè)計時,已經(jīng)綁定到了文本框的相應(yīng)槽函數(shù)。
# ".h"
calculatorbutton::calculatorbutton(QWidget* parent) :QPushButton(parent) {
connect(this, SIGNAL(clicked()), this, SLOT(sendchar()));
}
void calculatorbutton::sendchar() {
char res = this->text().at(0).toLatin1();
emit click(res);
復(fù)制
負(fù)責(zé)運(yùn)算和現(xiàn)實(shí)ui的計算器類 .h
計算器類繼承自,構(gòu)造函數(shù)將會渲染設(shè)計好的ui。只要定義下計算用戶數(shù)據(jù)的函數(shù),以及發(fā)射結(jié)果的信號即可。
#
#define CALCULATOR_H
#include
#include "ui_calculatorui.h"
class Calculator : public QMainWindow {
Q_OBJECT;
public:
Calculator(QWidget* parent = nullptr);
public slots:
void calculate(QString);
signals:
void sendresult(QString);
private:
QString inputtext;
QString resulttext;
QVector checkstack;
Ui::MainWindow ui;
復(fù)制
這里比較關(guān)鍵的點(diǎn)就是程序如何去調(diào)用和渲染UI。頭文件引用了編譯好的ui文件,隨后在私有變量定義了ui類Ui:: ui。在cpp文件中定義構(gòu)造函數(shù)時,只需要執(zhí)行Ui::的setup函數(shù)即可。隨后綁定一下和顯示器的信號和槽函數(shù),方法如下。函數(shù)受限于時間問題,這里沒有寫。
# ".h"
Calculator::Calculator(QWidget* parent) :QMainWindow(parent) {
ui.setupUi(this);
calculatortext* textedit = this->findChild("textEdit");
connect(this, SIGNAL(sendresult(QString)), textedit, SLOT(showresult(QString)));
connect(textedit, SIGNAL(sendtext(QString)), this, SLOT(calculate(QString)));
}
void Calculator::calculate(QString) {
emit sendresult(QString("success!"));
復(fù)制
主程序
主程序如下,每一個qt程序的主程序應(yīng)該都類似。
# ".h"
#include
int main(int argc, char* argv[]) {
QApplication app(argc, argv);
Calculator w;
w.show();
return app.exec();
復(fù)制
至此,小程序已經(jīng)可以運(yùn)行。
編譯前遇到了無法解析的外部引用,后來發(fā)現(xiàn)模塊沒有導(dǎo)入,如下。
總結(jié)
本節(jié)介紹了如何去實(shí)現(xiàn)自定義的控件,核心運(yùn)行的計算器類以及不同對象之間利用信號與槽函數(shù)進(jìn)行通訊,體會了如何組織和構(gòu)建一個qt程序。其中我們不關(guān)注算法如何實(shí)現(xiàn),只關(guān)注如何使這些代碼組織起來,協(xié)調(diào)運(yùn)行。至于如何處理用戶的輸入,隨后有時間更新。
本文共 931 個字?jǐn)?shù),平均閱讀時長 ≈ 3分鐘