QT(简易计算器流程图)
数字按钮:
用户点击 "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 是命名空间
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)