惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

B
Blog
Cyberwarzone
Cyberwarzone
Cloudbric
Cloudbric
P
Palo Alto Networks Blog
S
Securelist
Security Latest
Security Latest
T
Tor Project blog
J
Java Code Geeks
量子位
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
腾讯CDC
T
Troy Hunt's Blog
V
Visual Studio Blog
H
Hacker News: Front Page
P
Privacy International News Feed
Jina AI
Jina AI
Hacker News - Newest:
Hacker News - Newest: "LLM"
Apple Machine Learning Research
Apple Machine Learning Research
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
S
Schneier on Security
N
News and Events Feed by Topic
T
The Exploit Database - CXSecurity.com
The Last Watchdog
The Last Watchdog
Hacker News: Ask HN
Hacker News: Ask HN
Recent Commits to openclaw:main
Recent Commits to openclaw:main
博客园 - 【当耐特】
博客园_首页
爱范儿
爱范儿
阮一峰的网络日志
阮一峰的网络日志
酷 壳 – CoolShell
酷 壳 – CoolShell
罗磊的独立博客
T
Threat Research - Cisco Blogs
雷峰网
雷峰网
N
News and Events Feed by Topic
Google DeepMind News
Google DeepMind News
SecWiki News
SecWiki News
C
Cisco Blogs
L
LINUX DO - 最新话题
MongoDB | Blog
MongoDB | Blog
www.infosecurity-magazine.com
www.infosecurity-magazine.com
K
Kaspersky official blog
小众软件
小众软件
博客园 - 聂微东
D
Docker
The GitHub Blog
The GitHub Blog
IT之家
IT之家
A
Arctic Wolf
L
LINUX DO - 热门话题

猫涅的秘密结社

hackthissite-org 数据库原理相关 关于在与我互动前你可能需要了解的事 信安roadmap 个人主页开发汇报 六级生词速记本——附考后感想 数据结构C++自学相关 NewStarCTF-2025 三款steam付费番茄钟软件测评 夏令营-ai hello-world 新新的年 qq机器人配置二三事 搞点java 读书笔记-当下的力量 网页小修时间 glibc更新记录 Vulhub在线靶场记录 Vulhub记录(旧的) 神奇脚本在哪里-CTF之Pwn BaseCTF高校联合新生赛2024 逆逆逆逆逆向-CTF之reverse 求解 夺旗时间 学学学 渗透测试相关 协议/漏洞/网络 最新的知识点 数据分析相关 zico2解析 OverTheWire-bandit解析 CTF实战相关2 靶机解析-gigachad ctf实战相关1 复习time 开学季 维修时间 小小修整 学校实训-笔记 每周靶机之Beelzebub 读书笔记-如何阅读一本书 DC-4解析 DC-2解析 每周靶机之ted 靶机-DC-1 每周靶机之bob potato解析 xss跨站点脚本攻击 每周靶机之Tommyboy1dot0 owasp命令执行漏洞 owasp文件包含漏洞 每周靶机之WALLABY'S-NIGHTMARE owasp上传漏洞 Hackademic.RTB1 owasp与sql注入与sqlmap liunx中sudo服务相关知识 liunx中ssh服务相关知识 moneybox解析 C语言相关1 关于加入aplayer的方式 再来一次 关于在next7.8.0中建设评论功能这件事 目前的进展 编辑小提示
qt环境下的c++程序编写
nirvana_felis · 2025-02-27 · via 猫涅的秘密结社

课程讲到了面向对象程序设计(C++)
那就根据课程写一些笔记

C++是在C的基础上扩展了面向对象的内容,所以C++完全兼容C

大学中使用的开发环境是qt 非常好用 能很方便的做出一些带ui的程序 这里会自学 并赛一些比较基础的实例上来

一、基础四则计算器

新建项目

先新建一个项目 文件-新建文件或项目-选择一个模板-Application-Qt Widgets Application-右下角确认选择
随后选择项目名称 具体目录 配置好编译文件 就可以开始编写了
1
可以看到系统会默认给我们添加main.cpp、文件名.cpp、 文件名.h和一个.pro项目文件,点击完成,即可创建出一个Qt桌面程序。

关于这些文件的具体作用我们先按下不表 来看看如何一步步打造自己的计算器吧

设计计算器ui

每个计算器程序都会有自己的ui(用户页面)——例如我接下来展示的 微软自带的计算器
2
在编写具体的代码之前 我们需要参考类似的布局 设计出差不多的页面
3
↑程序的最终效果图
双击左边项目栏中的ui文件 进入ui编辑的页面 可以看到左半边是各种常见的组件 比如按钮 文本框 勾选框之类的 只要在左边选择想要的组件 选中并拖拽到屏幕中央 便可以在你设计的程序里添加相应的内容
首先是 按钮 既然是计算器 那就肯定要有按钮
从左边拖出一个 push button 双击更改其上显示的文字 然后在右下角minimumsize和maximumsize处将按钮大小固定为40×40 再次选中该按钮 用 ctrl+c ctrl+v 来复制出一样的按钮 其中等于号可以进行微调 设置成90×40的大小
4
排列好大致的位置后 将所有按钮选中 点击上方的 栅格布局 按钮 就可以将这些按钮组合起来 调整位置更加方便
5
整个计算器上边的文字框名为组件 Line edit 导入方法同理
接下来为了方便代码的编写 我们要为每个按钮起一个对应的对象名 点击按钮后在右上角会自动显示 双击来改名
6
整个窗口的大小可以通过代码或者点击整个ui页面的背景 和调整按钮一样调整最大和最小尺寸
剩下有一部分可选的调整需要在cpp文件中定义
8

1
2
3
4
5
6
7
8
9
10
11
12
MainWindow::MainWindow(QWidget \*parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setMaximumSize(220,340); //窗口最大尺寸
this->setMinimumSize(220,340); //窗口最小尺寸
this->setWindowTitle("计算器"); //决定窗口标题
QFont f("微软雅黑",14); //设置字体与字号
ui->MainLineEdit->setFont(f); //套用字体
ui->EqualButton->setStyleSheet("background:pink"); //设置等于号背景为粉色
}

程序编写

页面已经设计完毕了 接下来我们需要一个程序来让每个按钮实现他应有的功能
首先 为了让每个按钮被点击时加入对应的字符 我们需要一个能够盛放对应字符的变量
回到编辑页面 在.h头文件里定义一个QString变量 expression 用它来记录整个过程
7
接下来 为了让每个按钮实现对应功能 再次回到设计页面 对相应的按钮右键单击-转到槽- 在跳出的窗口里点击clicked()-ok
会自动跳转到相应函数的定义中 编写一段对应代码即可

1
2
3
4
5
void MainWindow::on\_TwoButton\_clicked() //可能会根据程序和对象名有所不同
{
expression += "[对应字符]"; //在expression中插入对应的字符
ui->MainLineEdit->setText(expression); //让文本框中显示expression中的字符
}

依葫芦画瓢 把所有对应的按钮进行编写 清空 退格 等于 按钮则需要特殊的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
//清空
void MainWindow::on\_Clear\_clicked()
{
expression.clear();
ui->MainLineEdit->clear();
}
//退格
void MainWindow::on\_Backspace\_clicked()
{
expression.chop(1);
ui->MainLineEdit->setText(expression);
}
//等于
void MainWindow::on\_EqualButton\_clicked() {
if (expression.isEmpty()) {
ui->MainLineEdit->setText("Error");
return;
}
QStack<double> s\_num; // 改为double以支持浮点
QStack<char> s\_opt;
QByteArray ba = expression.toUtf8();
const char \*opt = ba.constData();
int i = 0;
double tmp = 0;
bool isNum = false;
while (opt[i] != '\0' || !s\_opt.empty()) {
if (isdigit(opt[i])) {
tmp = tmp \* 10 + (opt[i] - '0');
i++;
isNum = true;
} else if (opt[i] == '.' && isNum) {
// 处理小数部分(需扩展逻辑)
i++;
double fraction = 0.1;
while (isdigit(opt[i])) {
tmp += (opt[i] - '0') \* fraction;
fraction \*= 0.1;
i++;
}
} else {
if (isNum) {
s\_num.push(tmp);
tmp = 0;
isNum = false;
}
// 运算符处理逻辑
if (s\_opt.empty() || Priority(opt[i]) > Priority(s\_opt.top()) ||
(s\_opt.top() == '(' && opt[i] != ')')) {
if (opt[i] != '\0') {
s\_opt.push(opt[i]);
i++;
}
} else {
while (!s\_opt.empty() &&
(Priority(opt[i]) <= Priority(s\_opt.top()) || opt[i] == ')')) {
char ch = s\_opt.pop();
if (ch == '(' && opt[i] == ')') {
i++;
break;
}
if (s\_num.size() < 2) {
ui->MainLineEdit->setText("Error");
return;
}
double num2 = s\_num.pop();
double num1 = s\_num.pop();
switch (ch) {
case '+': s\_num.push(num1 + num2); break;
case '-': s\_num.push(num1 - num2); break;
case '\*': s\_num.push(num1 \* num2); break;
case '/':
if (num2 == 0) {
ui->MainLineEdit->setText("Error: Div 0");
return;
}
s\_num.push(num1 / num2);
break;
}
}
}
}
}
if (isNum) s\_num.push(tmp); // 处理最后一个数字
if (s\_num.empty()) {
ui->MainLineEdit->setText("Error");
} else {
ui->MainLineEdit->setText(QString::number(s\_num.top()));
}
}
int MainWindow::Priority(char ch) {
switch(ch) {
case '(':
return 3;
case '\*':
case '/':
return 2;
case '+':
case '-':
return 1;
default:
return 0;
}
}

都设置完之后点击左下角的编译 就可以测试成功运行了

注:cmd环境下不会显示UTF-8 需要在main函数中预先输入system(“chcp 65001”);

结尾/引用

We are just another visitor in a transient world.