Qt编程入门:实现一个简单的计算器小程序

Qt 是一个功能强大的跨平台 C++ 框架,广泛用于开发图形用户界面(GUI)应用程序。本文将手把手教你如何使用Qt在Windows上实现一个简单的计算器小程序。这个计算器支持四则运算、小数点、百分号等功能。

1. 环境准备

在开始之前,确保你已经安装了以下工具:

  • Qt Creator:Qt 的集成开发环境(IDE)。

  • Qt 库:确保你已经安装了 Qt 库,并且配置好了开发环境。

如果你还没有安装 Qt,可以从 Qt 官方网站 下载并安装。

2. 创建项目

首先,打开 Qt Creator 并创建一个新的 Qt Widgets 应用程序项目。

  1. 选择 File -> New File or Project

  2. 选择 Application -> Qt Widgets Application,然后点击 Choose

  3. 输入项目名称,例如 Calculator,然后选择项目保存的路径。

  4. 在 Kit Selection 页面,选择你安装的 Qt 版本,然后点击 Next

  5. 在 Class Information 页面,保持默认设置,点击 Next,然后点击 Finish

这个项目主要由以下几个文件组成:

Calculator/
├── main.cpp          // 主程序入口
├── calculator.ui     // UI界面文件
├── calculator.h      // 计算器类的头文件
└── calculator.cpp    // 计算器类的实现文件

3. 设计UI界面

3.1 打开calculator.ui文件

在Qt Creator中,双击calculator.ui文件,打开Qt Designer。我们将在这里设计计算器的界面。

3.2 添加按钮和显示框

  1. 显示框:从左侧的Widget Box中拖拽一个Line Edit到窗体上,作为计算器的显示框。将其对象名称改为display

  2. 按钮:从Widget Box中拖拽多个Push Button到窗体上,分别命名为btn0btn1, ..., btn9btnAddbtnSubtractbtnMultiplybtnDividebtnDecimalbtnPercentbtnEqualsbtnClear。这些按钮分别对应数字0-9、加、减、乘、除、小数点、百分号、等于和清除功能。

3.3 布局

将所有按钮和显示框按照计算器的常见布局进行排列。双击部品可以为部品添加显示文言,在右侧的属性栏中可以修改部品的字体大小、类型等属性。

示例图:

4. 代码实现

4.1 主程序入口 (main.cpp)

主程序的职责是启动应用程序并显示计算器窗口:

#include <QApplication>
#include "calculator.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);  // 创建一个Qt应用程序对象

    Calculator calculator;         // 创建计算器对象
    calculator.show();             // 显示计算器窗口

    return app.exec();             // 进入应用程序的主事件循环
}

4.2 计算器类定义 (calculator.h)

在头文件中,我们定义了 Calculator 类,并声明了槽函数和成员变量:

#ifndef CALCULATOR_H
#define CALCULATOR_H

#include <QWidget>

namespace Ui {
class Calculator;
}

class Calculator : public QWidget
{
    Q_OBJECT

public:
    explicit Calculator(QWidget *parent = nullptr);  // 构造函数
    ~Calculator();                                   // 析构函数

private slots:
    void digitClicked();                             // 处理数字按钮点击事件
    void operatorClicked();                          // 处理运算符按钮点击事件
    void equalsClicked();                            // 处理等于按钮点击事件
    void clearClicked();                             // 处理清除按钮点击事件
    void decimalClicked();                           // 处理小数点按钮点击事件
    void percentClicked();                           // 处理百分号按钮点击事件

private:
    Ui::Calculator *ui;                              // UI界面指针
    double firstOperand;                             // 第一个操作数
    double secondOperand;                            // 第二个操作数
    QString pendingOperator;                         // 待处理的运算符
    bool waitingForOperand;                          // 是否等待操作数
    bool operatorOperated;                           // 运算符是否已操作
};

#endif // CALCULATOR_H

4.3 计算器类实现 (calculator.cpp)

在实现文件中,我们完成了以下功能:

4.3.1 构造函数

在构造函数中,我们初始化界面并连接信号槽:

Calculator::Calculator(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Calculator)
{
    // 初始化UI界面
    ui->setupUi(this); 
    ui->display->setText("0");

    // 连接数字按钮的点击信号到digitClicked槽函数
    for (int i = 0; i < 10; ++i) {
        QString buttonName = "btn" + QString::number(i);
        QPushButton *button = findChild<QPushButton *>(buttonName);
        connect(button, &QPushButton::clicked, this, &Calculator::digitClicked);
    }

    // 连接运算符按钮的点击信号到operatorClicked槽函数
    connect(ui->btnAdd, &QPushButton::clicked, this, &Calculator::operatorClicked);
    connect(ui->btnSubtract, &QPushButton::clicked, this, &Calculator::operatorClicked);
    connect(ui->btnMultiply, &QPushButton::clicked, this, &Calculator::operatorClicked);
    connect(ui->btnDivide, &QPushButton::clicked, this, &Calculator::operatorClicked);

    // 连接其他按钮的点击信号到相应的槽函数
    connect(ui->btnEquals, &QPushButton::clicked, this, &Calculator::equalsClicked);
    connect(ui->btnClear, &QPushButton::clicked, this, &Calculator::clearClicked);
    connect(ui->btnDecimal, &QPushButton::clicked, this, &Calculator::decimalClicked);
    connect(ui->btnPercent, &QPushButton::clicked, this, &Calculator::percentClicked);

    // 初始化变量
    firstOperand = 0.0;
    secondOperand = 0.0;
    pendingOperator = "";
    waitingForOperand = true;
    operatorOperated = false;
}
4.3.2 数字按钮点击处理 (digitClicked)

当用户点击数字按钮时,更新显示框的内容:

void Calculator::digitClicked()
{
    QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());  // 获取被点击的按钮
    QString digitValue = clickedButton->text();  // 获取按钮的文本
    QString displayText = ui->display->text();   // 获取当前显示框的文本

    if (waitingForOperand) {
        ui->display->clear();  // 如果等待操作数,则清空显示框
        waitingForOperand = false;
    }

    // 更新显示框的文本
    if ("0" == displayText) {
        if (0.0 == digitValue.toDouble()) {
            ui->display->setText("0");
        } else {
            ui->display->setText(digitValue);
        }
    } else {
        if (!operatorOperated) {
            ui->display->setText(displayText + digitValue);
        } else {
            ui->display->setText(digitValue);
        }
    }

    operatorOperated = false;
}
4.3.3 运算符按钮点击处理 (operatorClicked)

当用户点击运算符按钮时,记录第一个操作数和运算符:

void Calculator::operatorClicked()
{
    QPushButton *clickedButton = qobject_cast<QPushButton *>(sender());  // 获取被点击的按钮
    QString newOperator = clickedButton->text();  // 获取按钮的文本

    if (!operatorOperated) {
        if (!pendingOperator.isEmpty()) {
            // 如果已经有待处理的运算符,则先计算之前的结果
            equalsClicked();
        }
    }

    firstOperand = ui->display->text().toDouble();  // 获取第一个操作数
    pendingOperator = newOperator;  // 设置待处理的运算符
    waitingForOperand = true;  // 等待第二个操作数
    operatorOperated = true;  // 运算符已操作
}
4.3.4 等于按钮点击处理 (equalsClicked)

当用户点击等于按钮时,计算结果并显示:

void Calculator::equalsClicked()
{
    secondOperand = ui->display->text().toDouble();  // 获取第二个操作数

    double result = 0.0;
    bool error = false;
    if ("+" == pendingOperator) {
        result = firstOperand + secondOperand;
    } else if ("-" == pendingOperator) {
        result = firstOperand - secondOperand;
    } else if ("*" == pendingOperator) {
        result = firstOperand * secondOperand;
    } else if ("/" == pendingOperator) {
        if (0.0 != secondOperand) {
            result = firstOperand / secondOperand;
        } else {
            error = true;
        }
    } else {
        result = secondOperand;
    }

    if (!error) {
        ui->display->setText(QString::number(result));  // 显示计算结果
    } else {
        ui->display->setText("Error: Division by zero");  // 显示Error结果
    }

    pendingOperator = "";  // 清空待处理的运算符
    waitingForOperand = true;  // 等待新的操作数
    operatorOperated = true;
}
4.3.5 其他功能实现

当用户点击等于清除、小数点、百分号按钮时对应处理如下:

void Calculator::clearClicked()
{
    ui->display->setText("0");  //清0显示框
    firstOperand = 0.0;
    secondOperand = 0.0;
    pendingOperator = "";
    waitingForOperand = true;
    operatorOperated = false;
}

void Calculator::decimalClicked()
{
    QString displayText = ui->display->text();

    // 添加小数点
    if (!operatorOperated) {
        if (!displayText.contains('.')) {
            ui->display->setText(displayText + '.');
        }
    } else {
        ui->display->setText("0.");
    }

    operatorOperated = false;
}

void Calculator::percentClicked()
{
    if (!waitingForOperand) {
        double value = ui->display->text().toDouble();
        value *= 0.01;  // 转换为百分数
        ui->display->setText(QString::number(value));  // 显示结果
    }
}

5. 运行程序

完成上述步骤后,点击 Run 按钮(Ctrl + R),编译并运行程序。你应该会看到一个简单的计算器窗口,可以进行基本的加减乘除运算。示例如下:

6. 总结

本文,我们一步步实现了一个简单的计算器小程序。我们从项目创建、界面设计到代码编写,详细讲解了每一个步骤。希望这篇文章能对你入门Qt 编程有帮助 ,感兴趣快来试试吧。

下载地址:点击下载源代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值