数字按钮:

用户点击 "1"
    │
    ▼
waitingForSecond 是否为 true?
    │
    ├── 是 → 清空屏幕 → waitingForSecond = false
    │
    └── 否 → 跳过
    │
    ▼
屏幕显示 = 屏幕原内容 + "1"
    │
    ▼
结束

运算符:

用户点击 "+"
    │
    ▼
firstNumber = 屏幕当前数字
    │
    ▼
currentOp = "+"
    │
    ▼
waitingForSecond = true
    │
    ▼
结束

等号:

用户点击 "="
    │
    ▼
currentOp 是否为空?
    │
    ├── 是 → 屏幕显示"请先按运算符" → 结束
    │
    └── 否 → 继续
    │
    ▼
secondNumber = 屏幕当前数字
    │
    ▼
判断 currentOp 的值
    │
    ├── 是 "+" → result = firstNumber + secondNumber
    │
    ├── 是 "-" → result = firstNumber - secondNumber
    │
    ├── 是 "*" → result = firstNumber * secondNumber
    │
    └── 是 "/" → 
            │
            ▼
        secondNumber 是否为 0?
            │
            ├── 是 → 屏幕显示"除数不能为0" → 结束
            │
            └── 否 → result = firstNumber / secondNumber
    │
    ▼
屏幕显示 result
    │
    ▼
firstNumber = result
    │
    ▼
waitingForSecond = true
    │
    ▼
结束

清空:

用户点击 "C"
    │
    ▼
清空屏幕
    │
    ▼
firstNumber = 0
    │
    ▼
currentOp = ""(空字符串)
    │
    ▼
waitingForSecond = false
    │
    ▼
结束

总结:

好的,我把你在做这个计算器过程中涉及的 **Qt 知识点** 和 **C++ 知识点** 分别总结出来。

---

## 一、Qt 知识点

### 1. Qt 核心类

| 类名 | 作用 | 你在哪里用的 |
|------|------|-------------|
| `QMainWindow` | 主窗口基类 | `class MainWindow : public QMainWindow` |
| `QPushButton` | 按钮控件 | 数字键、运算符键、等号键、清空键 |
| `QLineEdit` | 单行输入框 | 计算器的屏幕 `display` |
| `QMessageBox` | 消息弹窗 | 调试时弹提示(`QMessageBox::information`) |
| `QString` | 字符串类 | 屏幕文字、运算符存储、类型转换 |

### 2. Qt 信号与槽

| 概念 | 说明 | 你的代码 |
|------|------|----------|
| 信号 | 控件发出的事件 | `clicked()` 信号 |
| 槽 | 响应信号的函数 | `on_Button1_clicked()` |
| 连接方式 | 自动连接(按命名规则) | `on_按钮objectName_信号名()` |

**命名规则:**
```cpp
// 格式:on_对象名_信号名
void MainWindow::on_Button1_clicked()   // 按钮叫 Button1,信号是 clicked
```

### 3. Qt Designer 界面设计

| 操作 | 说明 |
|------|------|
| 拖拽控件 | 从左侧控件箱拖到设计图纸 |
| 修改属性 | 右侧属性面板改 `text`、`objectName`、`readOnly` |
| 布局管理 | 拖拽摆放控件位置(未使用网格布局,手动摆放) |

### 4. Qt 常用函数

| 函数 | 作用 | 例子 |
|------|------|------|
| `setText()` | 设置控件文字 | `ui->display->setText("123")` |
| `text()` | 获取控件文字 | `ui->display->text()` |
| `clear()` | 清空控件文字 | `ui->display->clear()` |
| `toDouble()` | 字符串转数字 | `ui->display->text().toDouble()` |
| `QString::number()` | 数字转字符串 | `QString::number(result)` |
| `qDebug()` | 调试输出 | `qDebug() << "x = " << x` |

### 5. Qt 指针访问规则

| 写法 | 含义 | 正确吗 |
|------|------|--------|
| `ui->display` | display 是一个指针 | ✅ |
| `ui->display->setText()` | 指针用箭头访问 | ✅ |
| `ui->display.setText()` | 指针用点号访问 | ❌ 错误 |

### 6. Qt 项目结构

| 文件 | 作用 |
|------|------|
| `mainwindow.h` | 头文件:声明类、成员变量、槽函数 |
| `mainwindow.cpp` | 实现文件:写槽函数的具体逻辑 |
| `mainwindow.ui` | 界面文件:用 Qt Designer 设计的界面 |
| `main.cpp` | 入口文件:创建应用程序对象和主窗口 |

---

## 二、C++ 知识点

### 1. 类与对象

| 概念 | 说明 | 你的代码 |
|------|------|----------|
| 类 | 图纸/模板 | `class MainWindow { ... };` |
| 对象 | 按图纸造的实物 | `MainWindow w;` |
| 构造函数 | 创建对象时自动执行 | `MainWindow::MainWindow()` |
| 析构函数 | 销毁对象时自动执行 | `MainWindow::~MainWindow()` |

### 2. 访问控制(public / private)

| 关键字 | 谁能访问 | 你的代码 |
|--------|----------|----------|
| `public` | 任何人 | `MainWindow(QWidget *parent)` |
| `private` | 只有类内部 | `Ui::MainWindow *ui`、`firstNumber`、`currentOp`、`waitingForSecond` |

### 3. 变量类型

| 类型 | 说明 | 例子 |
|------|------|------|
| `int` | 整数 | `int a = 5;` |
| `double` | 双精度浮点数(小数) | `double x = 3.14;` |
| `bool` | 布尔值(true/false) | `bool flag = true;` |
| `QString` | Qt 字符串 | `QString s = "hello";` |

### 4. 变量的作用域

| 作用域 | 说明 | 你的代码 |
|--------|------|----------|
| 成员变量 | 整个类的所有函数都能用 | `firstNumber`、`currentOp`、`waitingForSecond` |
| 局部变量 | 只在当前函数内能用 | `secondNumber`、`result` |

### 5. 控制结构

| 结构 | 说明 | 你的代码 |
|------|------|----------|
| `if` | 如果条件成立 | `if (waitingForSecond) { ... }` |
| `if-else` | 如果...否则... | `if (currentOp == "+") { ... } else if (currentOp == "-") { ... }` |

### 6. 函数

| 概念 | 说明 | 你的代码 |
|------|------|----------|
| 函数声明 | 告诉编译器有这个函数 | `void on_Button1_clicked();` |
| 函数定义 | 写具体逻辑 | `void MainWindow::on_Button1_clicked() { ... }` |
| 参数 | 传给函数的数据 | `QString::number(result)` 中的 `result` |
| 返回值 | 函数返回的结果 | `QString::number()` 返回 `QString` |
| `void` | 无返回值 | `void on_Button1_clicked()` |

### 7. 指针与成员访问

| 写法 | 含义 | 例子 |
|------|------|------|
| `->` | 指针访问成员 | `ui->display->setText()` |
| `::` | 作用域解析符(属于) | `QString::number()` |
| `.` | 对象访问成员 | `text.length()`(QString 对象用点) |

### 8. 命名空间

| 写法 | 说明 | 例子 |
|------|------|------|
| `Ui` | Qt 生成的界面命名空间 | `namespace Ui { class MainWindow; }` |

### 9. 预处理指令

| 指令 | 说明 | 你的代码 |
|------|------|----------|
| `#include` | 包含头文件 | `#include "mainwindow.h"`、`#include <QMessageBox>` |
| `#ifndef` / `#define` / `#endif` | 防止头文件重复包含 | `mainwindow.h` 开头 |

---

## 三、关联总结(Qt 与 C++ 如何结合)

```
┌─────────────────────────────────────────────────────────────────────┐
│                        C++ 基础知识                                  │
│  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐   │
│  │ 类/对象     │ │ public/     │ │ if 判断     │ │ 变量类型    │   │
│  │            │ │ private     │ │            │ │ (double,    │   │
│  └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │  bool,      │   │
│         │               │               │        │  QString)   │   │
│         └───────────────┼───────────────┘        └──────┬──────┘   │
│                         │                                 │        │
│                         ▼                                 ▼        │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                      Qt 框架                                │   │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐           │   │
│  │  │ QMainWindow │ │ QPushButton │ │ QLineEdit   │           │   │
│  │  │ (窗口类)    │ │ (按钮类)    │ │ (屏幕类)    │           │   │
│  │  └─────────────┘ └─────────────┘ └─────────────┘           │   │
│  │                                                             │   │
│  │  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐           │   │
│  │  │ 信号/槽     │ │ setText()   │ │ toDouble()  │           │   │
│  │  │ (事件机制)  │ │ text()      │ │ number()    │           │   │
│  │  └─────────────┘ └─────────────┘ └─────────────┘           │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                         │                                          │
│                         ▼                                          │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                    你的计算器程序                            │   │
│  │  - 继承 QMainWindow 得到窗口能力                            │   │
│  │  - 使用 QPushButton、QLineEdit 构建界面                     │   │
│  │  - 用 C++ 变量存状态(firstNumber、currentOp)              │   │
│  │  - 用 if 判断运算符,执行对应计算                           │   │
│  │  - 用 Qt 函数实现屏幕读写和类型转换                         │   │
│  └─────────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────┘

 

一、-> 箭头:左边是指针

cpp

ui->display->setText("hello");
//  ↑       ↑
//  ui 是一个指针,display 也是一个指针

ui 为什么是指针?

cpp

// 在 mainwindow.h 里
private:
    Ui::MainWindow *ui;  // ← 星号表示 ui 是一个指针

记忆: 指针就像"遥控器",用 -> 按遥控器上的按钮。


二、. 点号:左边是对象

cpp

QString str = "hello";
int len = str.length();  // ← str 是对象,用 .

str 为什么是对象?

cpp

QString str;  // 没有星号,就是一个对象

对比:

cpp

QString str;        // str 是对象     → 用 .
QString *ptr = &str; // ptr 是指针     → 用 ->

三、:: 双冒号:左边是类名或命名空间

cpp

QString::number(3.14);  // ← QString 是类名,不是对象

什么时候用 ::

  • 调用静态函数(不需要创建对象的函数)

  • 使用命名空间里的东西

例子:

cpp

// 静态函数:不需要创建对象
QString::number(3.14);     // 类名::函数名
QMessageBox::information(); // 类名::函数名

// 命名空间
std::cout << "hello";       // std 是命名空间
Ui::MainWindow              // Ui 是命名空间

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐